/* vim: set ai et ts=4 sw=4: */ #ifdef HAVE_CONFIG_H #include #endif #include #include "playback.h" #include "mixer.h" #include #include #ifdef LINUX #include #else #include #endif // this may be specified with compiler options // such as -DMIXER_DEV_FILE=/dev/mymixer #ifndef MIXER_DEV_FILE #define MIXER_DEV_FILE "/dev/mixer" #endif /* * following code mainly comes from apollo player for kde * this codes tested only for linux */ /*-----------------------------------------------------------------*/ static Mixer* mixer = NULL; /*-----------------------------------------------------------------*/ Mixer* mixer_new(void) { if(mixer == NULL) { mixer = g_new0(Mixer, 1); mixer->dev= open(MIXER_DEV_FILE, O_RDWR); if(mixer->dev < 0) { g_print("Can't open mixer\n"); } mixer->vol_min = 0; mixer->vol_max = 0x7f; mixer->vol_step = (mixer->vol_max - mixer->vol_min + 1) / 10; } mixer->ref++; // simple reference counting ;) return mixer; } void mixer_free(Mixer* mixer) { if(--mixer->ref<= 0) { if(mixer->dev> 0) close(mixer->dev); g_free(mixer); mixer = NULL; } } void mixer_set_volume(Mixer* mixer, int vol) { vol = CLAMP(vol, mixer->vol_min, mixer->vol_max); playback_volume_set_factor((vol / 64.0) * 2.0); // use same volume for left and right channels vol = ((vol << 8) & 0x7f00) | (vol & 0x007f); //vol = ((right << 8) & 0x7f00) | (left & 0x007f); if(playback_volume_get_active()) return; if(mixer->dev < 0) return; if(ioctl(mixer->dev, MIXER_WRITE(SOUND_MIXER_PCM), &vol) == -1) { g_print("failed to set mixer volume\n"); } } void mixer_volume_up(Mixer* mixer) { mixer_set_volume(mixer, mixer_get_volume(mixer) + mixer->vol_step); } void mixer_volume_down(Mixer* mixer) { mixer_set_volume(mixer, mixer_get_volume(mixer) - mixer->vol_step); } int mixer_get_volume(Mixer* mixer) { int vol; if(mixer->dev < 0) return 0; if(ioctl(mixer->dev, MIXER_READ(SOUND_MIXER_PCM), &vol) == -1) { g_print("failed to get mixer volume\n"); return 0; } //int left = vol & 0x7f; //int right = (vol >> 8) & 0x7f; // use left channel return vol & 0x7f; } void mixer_set_mute(Mixer* mixer, gboolean mute) { mixer->mute = mute; if(mute) { mixer->vol_saved = mixer_get_volume(mixer); mixer_set_volume(mixer, 0); } else { mixer_set_volume(mixer, mixer->vol_saved); } } /*mixer.c*/