#include #include #include #include #include #include #if HAVE_DVB_API_VERSION < 3 #define VIDEO_DEV "/dev/dvb/card0/video0" #define AUDIO_DEV "/dev/dvb/card0/audio0" #include #include #else #define VIDEO_DEV "/dev/dvb/adapter0/video0" #define AUDIO_DEV "/dev/dvb/adapter0/audio0" #include #include #endif eDVBVolumecontrol* eDVBVolumecontrol::instance = NULL; eDVBVolumecontrol* eDVBVolumecontrol::getInstance() { if (instance == NULL) instance = new eDVBVolumecontrol; return instance; } eDVBVolumecontrol::eDVBVolumecontrol() { volumeUnMute(); setVolume(100, 100); } int eDVBVolumecontrol::openMixer() { return open( AUDIO_DEV, O_RDWR ); } void eDVBVolumecontrol::closeMixer(int fd) { close(fd); } void eDVBVolumecontrol::volumeUp(int left, int right) { printf("[volume.cpp] Volume up\n"); setVolume(leftVol + left, rightVol + right); } void eDVBVolumecontrol::volumeDown(int left, int right) { printf("[volume.cpp] Volume down\n"); setVolume(leftVol - left, rightVol - right); } int eDVBVolumecontrol::checkVolume(int vol) { if (vol < 0) vol = 0; else if (vol > 100) vol = 100; return vol; } void eDVBVolumecontrol::setVolume(int left, int right) { leftVol = checkVolume(left); rightVol = checkVolume(right); left = 63 - leftVol * 63 / 100; right = 63 - rightVol * 63 / 100; #if HAVE_DVB_API_VERSION < 3 audioMixer_t mixer; #else audio_mixer_t mixer; #endif #ifdef HAVE_DVB_API_VERSION mixer.volume_left = (left * left) / 64; mixer.volume_right = (right * right) / 64; #endif int fd = openMixer(); #ifdef HAVE_DVB_API_VERSION ioctl(fd, AUDIO_SET_MIXER, &mixer); #endif closeMixer(fd); printf("Setvolume: %d %d\n", leftVol, rightVol); printf("Setvolume: %d %d\n", left, right); } int eDVBVolumecontrol::getVolume() { if (isMuted()) return 0; return leftVol; } bool eDVBVolumecontrol::isMuted() { return muted; } void eDVBVolumecontrol::volumeMute() { int fd = openMixer(); #ifdef HAVE_DVB_API_VERSION ioctl(fd, AUDIO_SET_MUTE, true); #endif closeMixer(fd); muted = true; } void eDVBVolumecontrol::volumeUnMute() { int fd = openMixer(); #ifdef HAVE_DVB_API_VERSION ioctl(fd, AUDIO_SET_MUTE, false); #endif closeMixer(fd); muted = false; } void eDVBVolumecontrol::volumeToggleMute() { printf("Mute\n"); if (isMuted()) volumeUnMute(); else volumeMute(); }