GF_Err EPOCAudio::Open(u32 sample_rate, Bool stereo) { TInt res = 0; u32 count; TMdaAudioDataSettings::TAudioCaps epoc_sr; switch (sample_rate) { case 8000: epoc_sr = TMdaAudioDataSettings::ESampleRate8000Hz; break; case 11025: epoc_sr = TMdaAudioDataSettings::ESampleRate11025Hz; break; case 12000: epoc_sr = TMdaAudioDataSettings::ESampleRate12000Hz; break; case 16000: epoc_sr = TMdaAudioDataSettings::ESampleRate16000Hz; break; case 22050: epoc_sr = TMdaAudioDataSettings::ESampleRate22050Hz; break; case 24000: epoc_sr = TMdaAudioDataSettings::ESampleRate24000Hz; break; case 32000: epoc_sr = TMdaAudioDataSettings::ESampleRate32000Hz; break; case 44100: epoc_sr = TMdaAudioDataSettings::ESampleRate44100Hz; break; case 48000: epoc_sr = TMdaAudioDataSettings::ESampleRate48000Hz; break; default: return GF_NOT_SUPPORTED; } state = EPOC_AUDIO_INIT; gf_sleep(10); TRAP(res, m_stream = CMdaAudioOutputStream::NewL(*this) ); if ((res!=KErrNone) || !m_stream) { GF_LOG(GF_LOG_ERROR, GF_LOG_MMIO, ("[EPOCAudio] Cannot create output audio stream\n")); return GF_IO_ERR; } m_stream->Open(&m_settings); /*wait for ack - if not getting it in 50*40 = 2sec, abort*/ count = 50; while (count) { if (state == EPOC_AUDIO_OPEN) break; else if (state == EPOC_AUDIO_ERROR) { return GF_IO_ERR; } gf_sleep(40); TInt error; CActiveScheduler::RunIfReady(error, CActive::EPriorityIdle); count--; } if (state != EPOC_AUDIO_OPEN) { GF_LOG(GF_LOG_ERROR, GF_LOG_MMIO, ("[EPOCAudio] Failed to open sound device - is it present?\n")); return GF_NOT_SUPPORTED; } TRAP(res, m_stream->SetAudioPropertiesL(epoc_sr, stereo ? TMdaAudioDataSettings::EChannelsStereo : TMdaAudioDataSettings::EChannelsMono) ); m_stream->SetPriority(EPriorityAbsoluteHigh, EMdaPriorityPreferenceTime ); m_stream->SetVolume(init_vol * m_stream->MaxVolume() / 100); current_buffer = nb_buffers_queued = 0; GF_LOG(GF_LOG_DEBUG, GF_LOG_MMIO, ("[EPOCAudio] output audio stream ready - sample rate %d - %d channels\n", sample_rate, stereo ? 2 : 1)); return GF_OK; }
pj_status_t CPjAudioOutputEngine::StartPlay() { // Ignore command if playing is in progress. if (state_ == STATE_ACTIVE) return PJ_SUCCESS; // Destroy existing stream. if (iOutputStream_) delete iOutputStream_; iOutputStream_ = NULL; // Create the stream TRAPD(err, iOutputStream_ = CMdaAudioOutputStream::NewL(*this)); if (err != KErrNone) return PJ_RETURN_OS_ERROR(err); // Initialize settings. TMdaAudioDataSettings iStreamSettings; iStreamSettings.iChannels = get_channel_cap(parentStrm_->param.channel_count); iStreamSettings.iSampleRate = get_clock_rate_cap(parentStrm_->param.clock_rate); pj_assert(iStreamSettings.iChannels != 0 && iStreamSettings.iSampleRate != 0); PJ_LOG(4,(THIS_FILE, "Opening sound device for playback, " "clock rate=%d, channel count=%d..", parentStrm_->param.clock_rate, parentStrm_->param.channel_count)); // Open stream. lastError_ = KRequestPending; iOutputStream_->Open(&iStreamSettings); #if defined(PJMEDIA_AUDIO_DEV_MDA_USE_SYNC_START) && \ PJMEDIA_AUDIO_DEV_MDA_USE_SYNC_START != 0 startAsw_.Start(); #endif // Success PJ_LOG(4,(THIS_FILE, "Sound playback started")); return PJ_SUCCESS; }