📄 audio_session-mda.cpp
字号:
m_channels)); Message().Complete(err); } else { TRAP(err, (m_pStream = CMdaAudioOutputStream::NewL(*this))); if(KErrNone == err) { // open the audio device m_settings.iSampleRate = m_sampleRate; m_settings.iChannels = m_channels; m_settings.iVolume = m_pStream->MaxVolume()/2; m_settings.iFlags = 0; m_pStream->Open(&m_settings); } else { Message().Complete(err); } }}void HXSymbianAudioSession::DoCleanup(){ while(!m_bufferList.IsEmpty()) { IHXBuffer* pBuf = (IHXBuffer*)m_bufferList.RemoveHead(); HX_RELEASE(pBuf); } if (m_wantsNotify) { m_notifyRequest.Complete(KErrCancel); m_wantsNotify = false; } if (m_pStream) { m_pStream->Stop(); delete m_pStream; m_pStream = 0; m_open = false; } // remove session from server if( m_pServer) { m_pServer->DelSession(); m_pServer = 0; }}//// HXSymbianAudioSession::Play//void HXSymbianAudioSession::Play(){ if (m_reason != KErrNone) m_reason = KErrNone; // reset audio properties in case they changed on us TRAPD(error, m_pStream->SetAudioPropertiesL(m_sampleRate, m_channels)); m_pStream->SetPriority(KClientPriority, KPriorityPref); m_timeline.OnPlay(); m_bPaused = FALSE; if (ReadyToWrite()) { error = WriteNextBuffer(); } Message().Complete(error);}//// HXSymbianAudioSession::Pause//void HXSymbianAudioSession::Pause(){ m_timeline.OnPauseOrUnderflow(); m_bPaused = TRUE; if (m_pStream) { m_pStream->Stop(); } Message().Complete(KErrNone);}//// HXSymbianAudioSession::Write////void HXSymbianAudioSession::Write(){ TInt result = KErrArgument; IHXBuffer* pAudioBuf = (IHXBuffer*)Message().Ptr0(); if (pAudioBuf) { if (m_bufferList.AddTail(pAudioBuf)) { if (ReadyToWrite()) { result = WriteNextBuffer(); if (KErrNone != result) { // Remove the buffer we just appended // to the list m_bufferList.RemoveTail(); // Release our reference to the buffer HX_RELEASE(pAudioBuf); } } else { result = KErrNone; } } else { result = KErrNoMemory; } } Message().Complete(result);}//// HXSymbianAudioSession::GetTime//// Return the current playback position -- converts from// microseconds to milliseconds//void HXSymbianAudioSession::GetTime(){ Message().Complete(m_timeline.GetPlaybackTime());}//// HXSymbianAudioSession::GetBlocksBuffered//// Return the number of blocks buffered by this object.//void HXSymbianAudioSession::GetBlocksBuffered(){ Message().Complete(m_bufferList.GetCount());}//// HXSymbianAudioSession::SetVolume//// set the volume -- convert from 0-100 to 0-max range//void HXSymbianAudioSession::SetVolume(){ if (m_pStream) { m_pStream->SetVolume(Message().Int0()); } Message().Complete(0);}//// HXSymbianAudioSession::GetVolume//// get the current volume normalized to 0-100 range//void HXSymbianAudioSession::GetVolume(){ TInt vol = 0; if (m_pStream) { vol = m_pStream->Volume(); } Message().Complete(vol);}//// HXSymbianAudioSession::GetMaxVolume//// get the maxium device volume//void HXSymbianAudioSession::GetMaxVolume(){ TInt maxVol = 0; if (m_pStream) { maxVol = m_pStream->MaxVolume(); } Message().Complete(maxVol);}//// HXSymbianAudioSession::GetMinVolume//// get the minimum device volume//void HXSymbianAudioSession::GetMinVolume(){ Message().Complete(0);}//// HXSymbianAudioSession::Stop//// stop playback//void HXSymbianAudioSession::Stop(){ m_bPaused = TRUE; if(m_pStream) { m_pStream->Stop(); } // Cleanup any remaining buffers while(!m_bufferList.IsEmpty()) { IHXBuffer* pBuf = (IHXBuffer*)m_bufferList.RemoveHead(); HX_RELEASE(pBuf); } m_timeline.Reset(GetByteRate()); Message().Complete(KErrNone);}voidHXSymbianAudioSession::RequestDeviceTakenNotification(){ m_wantsNotify = true; m_notifyRequest = Message();}voidHXSymbianAudioSession::CancelDeviceTakenNotification(){ if (m_wantsNotify) { m_notifyRequest.Complete(KErrCancel); m_wantsNotify = false; }}//// HXSymbianAudioSession::NotifyDeviceTaken//// notify the client that the audio device has been taken if a// notification requrest has been made //void HXSymbianAudioSession::NotifyDeviceTaken(){ if (m_wantsNotify) { m_notifyRequest.Complete(m_reason); m_wantsNotify = false; }}//// callbacks//void HXSymbianAudioSession::MaoscOpenComplete(TInt error){ if (error == KErrNone) { m_open = true; TRAP(error, m_pStream->SetAudioPropertiesL(m_sampleRate, m_channels)); m_pStream->SetPriority(KClientPriority, KPriorityPref); } Message().Complete(error);}void HXSymbianAudioSession::MaoscBufferCopied(TInt error, const TDesC8& buf){ m_bWritePending = FALSE; // Check to see if we need a device time if (m_timeline.NeedDeviceTime()) { m_timeline.SetDeviceTime(GetDeviceMs()); } if (!m_bufferList.IsEmpty()) { // We should always enter here because the // last buffer written is at the head of the list. // We want to remove this buffer from the list since // this call is the completion of last WriteL() call. IHXBuffer* pBuf = (IHXBuffer*)m_bufferList.RemoveHead(); HX_RELEASE(pBuf); } if (ReadyToWrite()) { error = WriteNextBuffer(); }}void HXSymbianAudioSession::MaoscPlayComplete(TInt error){ if (KErrUnderflow == error) { m_timeline.OnPauseOrUnderflow(); } int resetErr; TRAP(resetErr, m_pStream->SetAudioPropertiesL(m_sampleRate, m_channels)); m_pStream->SetPriority(KClientPriority, KPriorityPref); if (error == KErrAbort) { m_reason = error; m_pServer->NotifyDeviceTaken(); }}UINT32 HXSymbianAudioSession::GetByteRate() const{ return 2 * FlagToNumber(m_sampleRate) * FlagToNumber(m_channels);}UINT32 HXSymbianAudioSession::GetDeviceMs(){ UINT32 ulRet = 0; if (m_pStream) { TTimeIntervalMicroSeconds pos = m_pStream->Position(); TInt64 millisecs = pos.Int64() / 1000; ulRet = millisecs.Low(); } return ulRet;}BOOL HXSymbianAudioSession::ReadyToWrite() const{ return !m_bWritePending && !m_bPaused && !m_bufferList.IsEmpty();}TInt HXSymbianAudioSession::WriteNextBuffer(){ // Write the next buffer in the list IHXBuffer* pBuffer = (IHXBuffer*)m_bufferList.GetHead(); TInt result = KErrNone; if (pBuffer) { if( m_pStream ) { int len = pBuffer->GetSize(); m_pData.Set((TUint8*)pBuffer->GetBuffer(), len, len); TRAP(result, m_pStream->WriteL(m_pData)); } else { // oom earlier? result = KErrNotReady; } } if (KErrNone == result) { m_timeline.OnWrite(pBuffer->GetSize()); m_bWritePending = TRUE; } else { m_bWritePending = FALSE; } return result;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -