OSDN Git Service

Merge "HAL stream format for mixer output threads must be stereo 16-bit PCM"
authorGlenn Kasten <gkasten@google.com>
Fri, 26 Jul 2013 21:33:40 +0000 (21:33 +0000)
committerAndroid (Google) Code Review <android-gerrit@google.com>
Fri, 26 Jul 2013 21:33:41 +0000 (21:33 +0000)
1  2 
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) {