From 34896629391ecc6dfda91baf55d5a846a0754c71 Mon Sep 17 00:00:00 2001 From: Bartosz Taudul Date: Sat, 15 Nov 2008 23:43:05 +0100 Subject: [PATCH] Allow conditional audio device disabling. Add support for disabling audio device when given circumstances are met. Currently the audio is disabled when application loses focus. --- src/audio/symbian/SDL_epocaudio.cpp | 32 ++++++++++++++++++++++++++++---- src/audio/symbian/streamplayer.cpp | 16 ++++++---------- src/audio/symbian/streamplayer.h | 2 -- src/main/symbian/SDL_main.cpp | 13 +++++++++++++ src/main/symbian/sdlexe.cpp | 1 + symbian/include/sdlepocapi.h | 11 +++++++++++ 6 files changed, 59 insertions(+), 16 deletions(-) diff --git a/src/audio/symbian/SDL_epocaudio.cpp b/src/audio/symbian/SDL_epocaudio.cpp index f7346ce..4a43147 100644 --- a/src/audio/symbian/SDL_epocaudio.cpp +++ b/src/audio/symbian/SDL_epocaudio.cpp @@ -32,6 +32,7 @@ #include #include "epoc_sdl.h" +#include "sdlepocapi.h" #include @@ -189,21 +190,44 @@ void CEpocAudio::Complete(int aState, int aError) TPtrC8 CEpocAudio::Data() { - TPtrC8 data(iBuffer, iBufferSize); - if(iWait->IsActive()) { iWait->Cancel(); CActiveScheduler::Stop(); } + if(g_SDL->GetSoundPauseReason() != CSDL::SPR_NONE) + { + if(iPlayer->Playing()) + { + iPlayer->Stop(); + } + return KNullDesC8(); + } + + TPtrC8 data(iBuffer, iBufferSize); + return data; } void CEpocAudio::Wait() { - // This wait will be terminated by call to Data() from audio buffer callback. - iWait->After(10000000); + if(g_SDL->GetSoundPauseReason() == CSDL::SPR_NONE) + { + if(!iPlayer->Playing()) + { + iPlayer->Start(); + } + + // This wait will be terminated by call to Data() from audio buffer callback. + iWait->After(10000000); + } + else + { + // This wait shouldn't be terminated. + iWait->After(100000); + } + CActiveScheduler::Start(); } diff --git a/src/audio/symbian/streamplayer.cpp b/src/audio/symbian/streamplayer.cpp index ced6210..be1a22f 100644 --- a/src/audio/symbian/streamplayer.cpp +++ b/src/audio/symbian/streamplayer.cpp @@ -52,9 +52,6 @@ CStreamPlayer::CStreamPlayer(MStreamProvider& aProvider, MStreamObs& aObs) , iVolume(KMaxVolume) { iStream = CMdaAudioOutputStream::NewL(*this, EMdaPriorityMax); - - iSilence.SetMax(); - iSilence.FillZ(); } CStreamPlayer::~CStreamPlayer() @@ -146,14 +143,13 @@ void CStreamPlayer::Request() { iPtr.Set(iProvider.Data()); } - if(iPtr.Length() == 0) - { - iPtr.Set(iSilence); - } - TRAPD(err, iStream->WriteL(iPtr)); - if(err != KErrNone) + if(iPtr.Length() != 0) { - iObs.Complete(MStreamObs::EWrite, err); + TRAPD(err, iStream->WriteL(iPtr)); + if(err != KErrNone) + { + iObs.Complete(MStreamObs::EWrite, err); + } } } diff --git a/src/audio/symbian/streamplayer.h b/src/audio/symbian/streamplayer.h index 1bd85e6..e507deb 100644 --- a/src/audio/symbian/streamplayer.h +++ b/src/audio/symbian/streamplayer.h @@ -3,7 +3,6 @@ #include -const int KSilenceBuffer = 1024; const int KMaxVolume = 256; class MStreamObs @@ -73,7 +72,6 @@ class CStreamPlayer : public CBase, public MMdaAudioOutputStreamCallback }; int iState; - TBuf8 iSilence; TPtrC8 iPtr; }; diff --git a/src/main/symbian/SDL_main.cpp b/src/main/symbian/SDL_main.cpp index 3d9dc33..80d34cc 100644 --- a/src/main/symbian/SDL_main.cpp +++ b/src/main/symbian/SDL_main.cpp @@ -243,6 +243,7 @@ static int DoMain() CSDL::CSDL() : m_orientationWait( false ) + , m_soundPauseReason( SPR_NONE ) { __ASSERT_ALWAYS(gEpocEnv == NULL, PANIC(KErrAlreadyExists)); gEpocEnv = new EpocSdlEnvData; @@ -331,6 +332,18 @@ void CSDL::SetOrientation(CAknAppUi::TAppUiOrientation orientation, const TSize& TRAPD(err, static_cast(CEikonEnv::Static()->EikAppUi())->SetOrientationL(orientation)); } +void CSDL::SetFocus(bool focused) +{ + if(focused) + { + m_soundPauseReason &= ~SPR_FOCUSLOST; + } + else + { + m_soundPauseReason |= SPR_FOCUSLOST; + } +} + void CSDL::MrccatoCommand(TRemConCoreApiOperationId aOperationId, TRemConCoreApiButtonAction aButtonAct) { if(aButtonAct != ERemConCoreApiButtonClick) diff --git a/src/main/symbian/sdlexe.cpp b/src/main/symbian/sdlexe.cpp index e961029..1f3df54 100644 --- a/src/main/symbian/sdlexe.cpp +++ b/src/main/symbian/sdlexe.cpp @@ -145,6 +145,7 @@ void CSDLAppUi::HandleResourceChangeL(int aType) void CSDLAppUi::HandleForegroundEventL(TBool aForeground) { CAknAppUi::HandleForegroundEventL(aForeground); + g_SDL->SetFocus(aForeground); } //////////////////////////////////////////////////////////////////////////// diff --git a/symbian/include/sdlepocapi.h b/symbian/include/sdlepocapi.h index 4e0d0b6..487a2dd 100644 --- a/symbian/include/sdlepocapi.h +++ b/symbian/include/sdlepocapi.h @@ -22,6 +22,13 @@ extern "C" class CSDL : public MRemConCoreApiTargetObserver { public: + enum SoundPauseReason + { + SPR_NONE = 0, + SPR_FOCUSLOST = 0x1, + SPR_SILENTPROFILE = 0x2 + }; + CSDL(); virtual ~CSDL(); @@ -33,6 +40,9 @@ class CSDL : public MRemConCoreApiTargetObserver CEventQueue* EventQueue() { return m_eventQueue; } void SetOrientation(CAknAppUi::TAppUiOrientation orientation, const TSize& aSize, TDisplayMode aMode); + int GetSoundPauseReason() const { return m_soundPauseReason; } + void SetFocus(bool focused); + private: void MrccatoCommand(TRemConCoreApiOperationId aOperationId, TRemConCoreApiButtonAction aButtonAct); @@ -40,6 +50,7 @@ class CSDL : public MRemConCoreApiTargetObserver bool m_orientationWait; TSize m_size; TDisplayMode m_mode; + int m_soundPauseReason; }; extern CSDL* g_SDL; -- 2.11.4.GIT