From 9d7c877b7c5b28d94629894354516e81ed1da3ab Mon Sep 17 00:00:00 2001 From: Stefan Seyfried Date: Sun, 22 Jan 2012 13:18:31 +0100 Subject: [PATCH] libtriple: use AVS mute to avoid audio pop during boot --- libtriple/audio_td.cpp | 12 ++++++++++++ libtriple/init_td.cpp | 4 ++++ libtriple/pwrmngr.cpp | 4 +++- 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/libtriple/audio_td.cpp b/libtriple/audio_td.cpp index aae4335..eb21456 100644 --- a/libtriple/audio_td.cpp +++ b/libtriple/audio_td.cpp @@ -6,6 +6,7 @@ #include +#include #define AUDIO_DEVICE "/dev/" DEVICE_NAME_AUDIO #include "audio_td.h" #include "lt_debug.h" @@ -37,6 +38,7 @@ void cAudio::openDevice(void) if ((fd = open(AUDIO_DEVICE, O_RDWR)) < 0) lt_info("openDevice: open failed (%m)\n"); fcntl(fd, F_SETFD, FD_CLOEXEC); + do_mute(true, false); } else lt_info("openDevice: already open (fd = %d)\n", fd); @@ -58,6 +60,7 @@ void cAudio::closeDevice(void) int cAudio::do_mute(bool enable, bool remember) { lt_debug("%s(%d, %d)\n", __FUNCTION__, enable, remember); + int avsfd; int ret; if (remember) Muted = enable; @@ -69,6 +72,15 @@ int cAudio::do_mute(bool enable, bool remember) if (clipfd != -1 || mixer_fd != -1) setVolume(volume,volume); /* considers "Muted" variable, "remember" is basically always true in this context */ + avsfd = open("/dev/stb/tdsystem", O_RDONLY); + if (avsfd >= 0) + { + if (enable) + ioctl(avsfd, IOC_AVS_SET_VOLUME, 31); + else + ioctl(avsfd, IOC_AVS_SET_VOLUME, 0); + close(avsfd); + } return ret; } diff --git a/libtriple/init_td.cpp b/libtriple/init_td.cpp index 07e576c..121297d 100644 --- a/libtriple/init_td.cpp +++ b/libtriple/init_td.cpp @@ -17,6 +17,7 @@ extern "C" { #include } #include "lt_dfbinput.h" +#include "pwrmngr.h" #include "lt_debug.h" #define lt_debug(args...) _lt_debug(TRIPLE_DEBUG_INIT, NULL, args) @@ -125,6 +126,9 @@ void init_td_api() lt_info("%s begin, initialized=%d, debug=0x%02x\n", __FUNCTION__, (int)initialized, debuglevel); if (!initialized) { + /* leave standby early, this avoids popping noise on audio device */ + cCpuFreqManager f; + f.SetCpuFreq(0); /* CPUFREQ == 0 is the trigger for leaving standby */ /* DirectFB does setpgid(0,0), which disconnects us from controlling terminal and thus disables e.g. ctrl-C. work around that. */ pid_t pid = getpgid(0); diff --git a/libtriple/pwrmngr.cpp b/libtriple/pwrmngr.cpp index 4788a4c..f16297e 100644 --- a/libtriple/pwrmngr.cpp +++ b/libtriple/pwrmngr.cpp @@ -58,8 +58,10 @@ bool cCpuFreqManager::SetCpuFreq(unsigned long f) } else { + ioctl(fd, IOC_AVS_SET_VOLUME, 31); /* mute AVS to avoid ugly noise */ ioctl(fd, IOC_AVS_STANDBY_LEAVE); - ioctl(fd, IOC_AVS_SET_VOLUME, 0); /* max gain */ + /* unmute will be done by cAudio::do_mute(). Ugly, but prevents pops */ + // ioctl(fd, IOC_AVS_SET_VOLUME, 0); /* max gain */ } close(fd);