From: Glenn Kasten Date: Fri, 26 Jul 2013 21:33:40 +0000 (+0000) Subject: Merge "HAL stream format for mixer output threads must be stereo 16-bit PCM" X-Git-Tag: android-x86-4.4-r1~258 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=422801c5e9b795105f28e639c4bed5ee3f4e56f3;p=android-x86%2Fframeworks-av.git Merge "HAL stream format for mixer output threads must be stereo 16-bit PCM" --- 422801c5e9b795105f28e639c4bed5ee3f4e56f3 diff --cc services/audioflinger/Threads.cpp index 296a485c50,09289235bf..a61b4126e5 --- a/services/audioflinger/Threads.cpp +++ b/services/audioflinger/Threads.cpp @@@ -1490,63 -1428,27 +1490,78 @@@ void AudioFlinger::PlaybackThread::audi mAudioFlinger->audioConfigChanged_l(event, mId, param2); } +void AudioFlinger::PlaybackThread::writeCallback() +{ + ALOG_ASSERT(mCallbackThread != 0); + mCallbackThread->setWriteBlocked(false); +} + +void AudioFlinger::PlaybackThread::drainCallback() +{ + ALOG_ASSERT(mCallbackThread != 0); + mCallbackThread->setDraining(false); +} + +void AudioFlinger::PlaybackThread::setWriteBlocked(bool value) +{ + Mutex::Autolock _l(mLock); + mWriteBlocked = value; + if (!value) { + mWaitWorkCV.signal(); + } +} + +void AudioFlinger::PlaybackThread::setDraining(bool value) +{ + Mutex::Autolock _l(mLock); + mDraining = value; + if (!value) { + mWaitWorkCV.signal(); + } +} + +// static +int AudioFlinger::PlaybackThread::asyncCallback(stream_callback_event_t event, + void *param, + void *cookie) +{ + AudioFlinger::PlaybackThread *me = (AudioFlinger::PlaybackThread *)cookie; + ALOGV("asyncCallback() event %d", event); + switch (event) { + case STREAM_CBK_EVENT_WRITE_READY: + me->writeCallback(); + break; + case STREAM_CBK_EVENT_DRAIN_READY: + me->drainCallback(); + break; + default: + ALOGW("asyncCallback() unknown event %d", event); + break; + } + return 0; +} + void AudioFlinger::PlaybackThread::readOutputParameters() { + // unfortunately we have no way of recovering from errors here, hence the LOG_FATAL mSampleRate = mOutput->stream->common.get_sample_rate(&mOutput->stream->common); mChannelMask = mOutput->stream->common.get_channels(&mOutput->stream->common); + if (!audio_is_output_channel(mChannelMask)) { + LOG_FATAL("HAL channel mask %#x not valid for output", mChannelMask); + } + if ((mType == MIXER || mType == DUPLICATING) && mChannelMask != AUDIO_CHANNEL_OUT_STEREO) { + LOG_FATAL("HAL channel mask %#x not supported for mixed output; " + "must be AUDIO_CHANNEL_OUT_STEREO", mChannelMask); + } mChannelCount = (uint16_t)popcount(mChannelMask); mFormat = mOutput->stream->common.get_format(&mOutput->stream->common); + if (!audio_is_valid_format(mFormat)) { + LOG_FATAL("HAL format %d not valid for output", mFormat); + } + if ((mType == MIXER || mType == DUPLICATING) && mFormat != AUDIO_FORMAT_PCM_16_BIT) { + LOG_FATAL("HAL format %d not supported for mixed output; must be AUDIO_FORMAT_PCM_16_BIT", + mFormat); + } mFrameSize = audio_stream_frame_size(&mOutput->stream->common); mFrameCount = mOutput->stream->common.get_buffer_size(&mOutput->stream->common) / mFrameSize; if (mFrameCount & 15) {