diff options
Diffstat (limited to 'services')
| -rw-r--r-- | services/audioflinger/AudioFlinger.cpp | 248 | ||||
| -rw-r--r-- | services/audioflinger/AudioFlinger.h | 60 | ||||
| -rw-r--r-- | services/audioflinger/AudioMixer.cpp | 20 | ||||
| -rw-r--r-- | services/audioflinger/AudioMixer.h | 3 | ||||
| -rw-r--r-- | services/audioflinger/AudioPolicyService.cpp | 9 | ||||
| -rw-r--r-- | services/audioflinger/AudioPolicyService.h | 2 | ||||
| -rw-r--r-- | services/camera/libcameraservice/CameraHardwareInterface.h | 94 | 
7 files changed, 194 insertions, 242 deletions
diff --git a/services/audioflinger/AudioFlinger.cpp b/services/audioflinger/AudioFlinger.cpp index a6ba1a0..44df5b5 100644 --- a/services/audioflinger/AudioFlinger.cpp +++ b/services/audioflinger/AudioFlinger.cpp @@ -44,7 +44,7 @@  #include <private/media/AudioEffectShared.h>  #include <system/audio.h> -#include <hardware/audio_hal.h> +#include <hardware/audio.h>  #include "AudioMixer.h"  #include "AudioFlinger.h" @@ -53,15 +53,7 @@  #include <media/EffectVisualizerApi.h>  // ---------------------------------------------------------------------------- -// the sim build doesn't have gettid -#ifndef HAVE_GETTID -# define gettid getpid -#endif - -// ---------------------------------------------------------------------------- - -extern const char * const gEffectLibPath;  namespace android { @@ -87,40 +79,20 @@ static const int kDumpLockSleep = 20000;  static const nsecs_t kWarningThrottle = seconds(5); -#define AUDIOFLINGER_SECURITY_ENABLED 1 -  // ----------------------------------------------------------------------------  static bool recordingAllowed() { -#ifndef HAVE_ANDROID_OS -    return true; -#endif -#if AUDIOFLINGER_SECURITY_ENABLED      if (getpid() == IPCThreadState::self()->getCallingPid()) return true;      bool ok = checkCallingPermission(String16("android.permission.RECORD_AUDIO"));      if (!ok) LOGE("Request requires android.permission.RECORD_AUDIO");      return ok; -#else -    if (!checkCallingPermission(String16("android.permission.RECORD_AUDIO"))) -        LOGW("WARNING: Need to add android.permission.RECORD_AUDIO to manifest"); -    return true; -#endif  }  static bool settingsAllowed() { -#ifndef HAVE_ANDROID_OS -    return true; -#endif -#if AUDIOFLINGER_SECURITY_ENABLED      if (getpid() == IPCThreadState::self()->getCallingPid()) return true;      bool ok = checkCallingPermission(String16("android.permission.MODIFY_AUDIO_SETTINGS"));      if (!ok) LOGE("Request requires android.permission.MODIFY_AUDIO_SETTINGS");      return ok; -#else -    if (!checkCallingPermission(String16("android.permission.MODIFY_AUDIO_SETTINGS"))) -        LOGW("WARNING: Need to add android.permission.MODIFY_AUDIO_SETTINGS to manifest"); -    return true; -#endif  }  // To collect the amplifier usage @@ -381,8 +353,8 @@ sp<IAudioTrack> AudioFlinger::createTrack(          pid_t pid,          int streamType,          uint32_t sampleRate, -        int format, -        int channelCount, +        uint32_t format, +        uint32_t channelMask,          int frameCount,          uint32_t flags,          const sp<IMemory>& sharedBuffer, @@ -450,7 +422,7 @@ sp<IAudioTrack> AudioFlinger::createTrack(          LOGV("createTrack() lSessionId: %d", lSessionId);          track = thread->createTrack_l(client, streamType, sampleRate, format, -                channelCount, frameCount, sharedBuffer, lSessionId, &lStatus); +                channelMask, frameCount, sharedBuffer, lSessionId, &lStatus);          // move effect chain to this output thread if an effect on same session was waiting          // for a track to be created @@ -498,7 +470,7 @@ int AudioFlinger::channelCount(int output) const      return thread->channelCount();  } -int AudioFlinger::format(int output) const +uint32_t AudioFlinger::format(int output) const  {      Mutex::Autolock _l(mLock);      PlaybackThread *thread = checkPlaybackThread_l(output); @@ -937,7 +909,7 @@ int AudioFlinger::ThreadBase::channelCount() const      return (int)mChannelCount;  } -int AudioFlinger::ThreadBase::format() const +uint32_t AudioFlinger::ThreadBase::format() const  {      return mFormat;  } @@ -1023,6 +995,8 @@ status_t AudioFlinger::ThreadBase::dumpBase(int fd, const Vector<String16>& args      result.append(buffer);      snprintf(buffer, SIZE, "Channel Count: %d\n", mChannelCount);      result.append(buffer); +    snprintf(buffer, SIZE, "Channel Mask: 0x%08x\n", mChannelMask); +    result.append(buffer);      snprintf(buffer, SIZE, "Format: %d\n", mFormat);      result.append(buffer);      snprintf(buffer, SIZE, "Frame size: %d\n", mFrameSize); @@ -1096,7 +1070,7 @@ status_t AudioFlinger::PlaybackThread::dumpTracks(int fd, const Vector<String16>      snprintf(buffer, SIZE, "Output thread %p tracks\n", this);      result.append(buffer); -    result.append("   Name  Clien Typ Fmt Chn Session Buf  S M F SRate LeftV RighV  Serv       User       Main buf   Aux Buf\n"); +    result.append("   Name  Clien Typ Fmt Chn mask   Session Buf  S M F SRate LeftV RighV  Serv       User       Main buf   Aux Buf\n");      for (size_t i = 0; i < mTracks.size(); ++i) {          sp<Track> track = mTracks[i];          if (track != 0) { @@ -1107,7 +1081,7 @@ status_t AudioFlinger::PlaybackThread::dumpTracks(int fd, const Vector<String16>      snprintf(buffer, SIZE, "Output thread %p active tracks\n", this);      result.append(buffer); -    result.append("   Name  Clien Typ Fmt Chn Session Buf  S M F SRate LeftV RighV  Serv       User       Main buf   Aux Buf\n"); +    result.append("   Name  Clien Typ Fmt Chn mask   Session Buf  S M F SRate LeftV RighV  Serv       User       Main buf   Aux Buf\n");      for (size_t i = 0; i < mActiveTracks.size(); ++i) {          wp<Track> wTrack = mActiveTracks[i];          if (wTrack != 0) { @@ -1193,8 +1167,8 @@ sp<AudioFlinger::PlaybackThread::Track>  AudioFlinger::PlaybackThread::createTra          const sp<AudioFlinger::Client>& client,          int streamType,          uint32_t sampleRate, -        int format, -        int channelCount, +        uint32_t format, +        uint32_t channelMask,          int frameCount,          const sp<IMemory>& sharedBuffer,          int sessionId, @@ -1204,11 +1178,14 @@ sp<AudioFlinger::PlaybackThread::Track>  AudioFlinger::PlaybackThread::createTra      status_t lStatus;      if (mType == DIRECT) { -        if (sampleRate != mSampleRate || format != mFormat || channelCount != (int)mChannelCount) { -            LOGE("createTrack_l() Bad parameter:  sampleRate %d format %d, channelCount %d for output %p", -                 sampleRate, format, channelCount, mOutput); -            lStatus = BAD_VALUE; -            goto Exit; +        if ((format & AUDIO_FORMAT_MAIN_MASK) == AUDIO_FORMAT_PCM) { +            if (sampleRate != mSampleRate || format != mFormat || channelMask != mChannelMask) { +                LOGE("createTrack_l() Bad parameter: sampleRate %d format %d, channelMask 0x%08x \"" +                        "for output %p with format %d", +                        sampleRate, format, channelMask, mOutput, mFormat); +                lStatus = BAD_VALUE; +                goto Exit; +            }          }      } else {          // Resampler implementation limits input sampling rate to 2 x output sampling rate. @@ -1245,7 +1222,7 @@ sp<AudioFlinger::PlaybackThread::Track>  AudioFlinger::PlaybackThread::createTra          }          track = new Track(this, client, streamType, sampleRate, format, -                channelCount, frameCount, sharedBuffer, sessionId); +                channelMask, frameCount, sharedBuffer, sessionId);          if (track->getCblk() == NULL || track->name() < 0) {              lStatus = NO_MEMORY;              goto Exit; @@ -1394,7 +1371,7 @@ void AudioFlinger::PlaybackThread::audioConfigChanged_l(int event, int param) {      switch (event) {      case AudioSystem::OUTPUT_OPENED:      case AudioSystem::OUTPUT_CONFIG_CHANGED: -        desc.channels = mChannels; +        desc.channels = mChannelMask;          desc.samplingRate = mSampleRate;          desc.format = mFormat;          desc.frameCount = mFrameCount; @@ -1414,8 +1391,8 @@ void AudioFlinger::PlaybackThread::audioConfigChanged_l(int event, int param) {  void AudioFlinger::PlaybackThread::readOutputParameters()  {      mSampleRate = mOutput->stream->common.get_sample_rate(&mOutput->stream->common); -    mChannels = mOutput->stream->common.get_channels(&mOutput->stream->common); -    mChannelCount = (uint16_t)popcount(mChannels); +    mChannelMask = mOutput->stream->common.get_channels(&mOutput->stream->common); +    mChannelCount = (uint16_t)popcount(mChannelMask);      mFormat = mOutput->stream->common.get_format(&mOutput->stream->common);      mFrameSize = (uint16_t)audio_stream_frame_size(&mOutput->stream->common);      mFrameCount = mOutput->stream->common.get_buffer_size(&mOutput->stream->common) / mFrameSize; @@ -1825,7 +1802,7 @@ uint32_t AudioFlinger::MixerThread::prepareTracks_l(const SortedVector< wp<Track                  AudioMixer::FORMAT, (void *)track->format());              mAudioMixer->setParameter(                  AudioMixer::TRACK, -                AudioMixer::CHANNEL_COUNT, (void *)track->channelCount()); +                AudioMixer::CHANNEL_MASK, (void *)track->channelMask());              mAudioMixer->setParameter(                  AudioMixer::RESAMPLE,                  AudioMixer::SAMPLE_RATE, @@ -2704,7 +2681,7 @@ void AudioFlinger::DuplicatingThread::addOutputTrack(MixerThread *thread)                                              this,                                              mSampleRate,                                              mFormat, -                                            mChannelCount, +                                            mChannelMask,                                              frameCount);      if (outputTrack->cblk() != NULL) {          thread->setStreamVolume(AUDIO_STREAM_CNT, 1.0f); @@ -2772,8 +2749,8 @@ AudioFlinger::ThreadBase::TrackBase::TrackBase(              const wp<ThreadBase>& thread,              const sp<Client>& client,              uint32_t sampleRate, -            int format, -            int channelCount, +            uint32_t format, +            uint32_t channelMask,              int frameCount,              uint32_t flags,              const sp<IMemory>& sharedBuffer, @@ -2793,6 +2770,7 @@ AudioFlinger::ThreadBase::TrackBase::TrackBase(      // LOGD("Creating track with %d buffers @ %d bytes", bufferCount, bufferSize);     size_t size = sizeof(audio_track_cblk_t); +   uint8_t channelCount = popcount(channelMask);     size_t bufferSize = frameCount*channelCount*sizeof(int16_t);     if (sharedBuffer == 0) {         size += bufferSize; @@ -2807,7 +2785,8 @@ AudioFlinger::ThreadBase::TrackBase::TrackBase(                  // clear all buffers                  mCblk->frameCount = frameCount;                  mCblk->sampleRate = sampleRate; -                mCblk->channelCount = (uint8_t)channelCount; +                mChannelCount = channelCount; +                mChannelMask = channelMask;                  if (sharedBuffer == 0) {                      mBuffer = (char*)mCblk + sizeof(audio_track_cblk_t);                      memset(mBuffer, 0, frameCount*channelCount*sizeof(int16_t)); @@ -2831,7 +2810,8 @@ AudioFlinger::ThreadBase::TrackBase::TrackBase(             // clear all buffers             mCblk->frameCount = frameCount;             mCblk->sampleRate = sampleRate; -           mCblk->channelCount = (uint8_t)channelCount; +           mChannelCount = channelCount; +           mChannelMask = channelMask;             mBuffer = (char*)mCblk + sizeof(audio_track_cblk_t);             memset(mBuffer, 0, frameCount*channelCount*sizeof(int16_t));             // Force underrun condition to avoid false underrun callback until first data is @@ -2898,7 +2878,11 @@ int AudioFlinger::ThreadBase::TrackBase::sampleRate() const {  }  int AudioFlinger::ThreadBase::TrackBase::channelCount() const { -    return (int)mCblk->channelCount; +    return (const int)mChannelCount; +} + +uint32_t AudioFlinger::ThreadBase::TrackBase::channelMask() const { +    return mChannelMask;  }  void* AudioFlinger::ThreadBase::TrackBase::getBuffer(uint32_t offset, uint32_t frames) const { @@ -2910,9 +2894,9 @@ void* AudioFlinger::ThreadBase::TrackBase::getBuffer(uint32_t offset, uint32_t f      if (bufferStart < mBuffer || bufferStart > bufferEnd || bufferEnd > mBufferEnd ||          ((unsigned long)bufferStart & (unsigned long)(cblk->frameSize - 1))) {          LOGE("TrackBase::getBuffer buffer out of range:\n    start: %p, end %p , mBuffer %p mBufferEnd %p\n    \ -                server %d, serverBase %d, user %d, userBase %d, channelCount %d", +                server %d, serverBase %d, user %d, userBase %d",                  bufferStart, bufferEnd, mBuffer, mBufferEnd, -                cblk->server, cblk->serverBase, cblk->user, cblk->userBase, cblk->channelCount); +                cblk->server, cblk->serverBase, cblk->user, cblk->userBase);          return 0;      } @@ -2927,12 +2911,12 @@ AudioFlinger::PlaybackThread::Track::Track(              const sp<Client>& client,              int streamType,              uint32_t sampleRate, -            int format, -            int channelCount, +            uint32_t format, +            uint32_t channelMask,              int frameCount,              const sp<IMemory>& sharedBuffer,              int sessionId) -    :   TrackBase(thread, client, sampleRate, format, channelCount, frameCount, 0, sharedBuffer, sessionId), +    :   TrackBase(thread, client, sampleRate, format, channelMask, frameCount, 0, sharedBuffer, sessionId),      mMute(false), mSharedBuffer(sharedBuffer), mName(-1), mMainBuffer(NULL), mAuxBuffer(NULL),      mAuxEffectId(0), mHasVolumeController(false)  { @@ -2952,7 +2936,7 @@ AudioFlinger::PlaybackThread::Track::Track(          mStreamType = streamType;          // NOTE: audio_track_cblk_t::frameSize for 8 bit PCM data is based on a sample size of          // 16 bit because data is converted to 16 bit before being stored in buffer by AudioTrack -        mCblk->frameSize = audio_is_linear_pcm(format) ? channelCount * sizeof(int16_t) : sizeof(int8_t); +        mCblk->frameSize = audio_is_linear_pcm(format) ? mChannelCount * sizeof(int16_t) : sizeof(int8_t);      }  } @@ -3000,12 +2984,12 @@ void AudioFlinger::PlaybackThread::Track::destroy()  void AudioFlinger::PlaybackThread::Track::dump(char* buffer, size_t size)  { -    snprintf(buffer, size, "   %05d %05d %03u %03u %03u %05u   %04u %1d %1d %1d %05u %05u %05u  0x%08x 0x%08x 0x%08x 0x%08x\n", +    snprintf(buffer, size, "   %05d %05d %03u %03u 0x%08x %05u   %04u %1d %1d %1d %05u %05u %05u  0x%08x 0x%08x 0x%08x 0x%08x\n",              mName - AudioMixer::TRACK0,              (mClient == NULL) ? getpid() : mClient->pid(),              mStreamType,              mFormat, -            mCblk->channelCount, +            mChannelMask,              mSessionId,              mFrameCount,              mState, @@ -3240,21 +3224,21 @@ AudioFlinger::RecordThread::RecordTrack::RecordTrack(              const wp<ThreadBase>& thread,              const sp<Client>& client,              uint32_t sampleRate, -            int format, -            int channelCount, +            uint32_t format, +            uint32_t channelMask,              int frameCount,              uint32_t flags,              int sessionId)      :   TrackBase(thread, client, sampleRate, format, -                  channelCount, frameCount, flags, 0, sessionId), +                  channelMask, frameCount, flags, 0, sessionId),          mOverflow(false)  {      if (mCblk != NULL) {         LOGV("RecordTrack constructor, size %d", (int)mBufferEnd - (int)mBuffer);         if (format == AUDIO_FORMAT_PCM_16_BIT) { -           mCblk->frameSize = channelCount * sizeof(int16_t); +           mCblk->frameSize = mChannelCount * sizeof(int16_t);         } else if (format == AUDIO_FORMAT_PCM_8_BIT) { -           mCblk->frameSize = channelCount * sizeof(int8_t); +           mCblk->frameSize = mChannelCount * sizeof(int8_t);         } else {             mCblk->frameSize = sizeof(int8_t);         } @@ -3334,10 +3318,10 @@ void AudioFlinger::RecordThread::RecordTrack::stop()  void AudioFlinger::RecordThread::RecordTrack::dump(char* buffer, size_t size)  { -    snprintf(buffer, size, "   %05d %03u %03u %05d   %04u %01d %05u  %08x %08x\n", +    snprintf(buffer, size, "   %05d %03u 0x%08x %05d   %04u %01d %05u  %08x %08x\n",              (mClient == NULL) ? getpid() : mClient->pid(),              mFormat, -            mCblk->channelCount, +            mChannelMask,              mSessionId,              mFrameCount,              mState, @@ -3353,10 +3337,10 @@ AudioFlinger::PlaybackThread::OutputTrack::OutputTrack(              const wp<ThreadBase>& thread,              DuplicatingThread *sourceThread,              uint32_t sampleRate, -            int format, -            int channelCount, +            uint32_t format, +            uint32_t channelMask,              int frameCount) -    :   Track(thread, NULL, AUDIO_STREAM_CNT, sampleRate, format, channelCount, frameCount, NULL, 0), +    :   Track(thread, NULL, AUDIO_STREAM_CNT, sampleRate, format, channelMask, frameCount, NULL, 0),      mActive(false), mSourceThread(sourceThread)  { @@ -3367,8 +3351,10 @@ AudioFlinger::PlaybackThread::OutputTrack::OutputTrack(          mCblk->volume[0] = mCblk->volume[1] = 0x1000;          mOutBuffer.frameCount = 0;          playbackThread->mTracks.add(this); -        LOGV("OutputTrack constructor mCblk %p, mBuffer %p, mCblk->buffers %p, mCblk->frameCount %d, mCblk->sampleRate %d, mCblk->channelCount %d mBufferEnd %p", -                mCblk, mBuffer, mCblk->buffers, mCblk->frameCount, mCblk->sampleRate, mCblk->channelCount, mBufferEnd); +        LOGV("OutputTrack constructor mCblk %p, mBuffer %p, mCblk->buffers %p, " \ +                "mCblk->frameCount %d, mCblk->sampleRate %d, mChannelMask 0x%08x mBufferEnd %p", +                mCblk, mBuffer, mCblk->buffers, +                mCblk->frameCount, mCblk->sampleRate, mChannelMask, mBufferEnd);      } else {          LOGW("Error creating output track on thread %p", playbackThread);      } @@ -3403,7 +3389,7 @@ bool AudioFlinger::PlaybackThread::OutputTrack::write(int16_t* data, uint32_t fr  {      Buffer *pInBuffer;      Buffer inBuffer; -    uint32_t channelCount = mCblk->channelCount; +    uint32_t channelCount = mChannelCount;      bool outputBufferFull = false;      inBuffer.frameCount = frames;      inBuffer.i16 = data; @@ -3688,8 +3674,8 @@ sp<IAudioRecord> AudioFlinger::openRecord(          pid_t pid,          int input,          uint32_t sampleRate, -        int format, -        int channelCount, +        uint32_t format, +        uint32_t channelMask,          int frameCount,          uint32_t flags,          int *sessionId, @@ -3738,7 +3724,7 @@ sp<IAudioRecord> AudioFlinger::openRecord(          }          // create new record track. The record track uses one track in mHardwareMixerThread by convention.          recordTrack = new RecordThread::RecordTrack(thread, client, sampleRate, -                                                   format, channelCount, frameCount, flags, lSessionId); +                                                   format, channelMask, frameCount, flags, lSessionId);      }      if (recordTrack->getCblk() == NULL) {          // remove local strong reference to Client before deleting the RecordTrack so that the Client @@ -4086,7 +4072,7 @@ status_t AudioFlinger::RecordThread::dump(int fd, const Vector<String16>& args)      if (mActiveTrack != 0) {          result.append("Active Track:\n"); -        result.append("   Clien Fmt Chn Session Buf  S SRate  Serv     User\n"); +        result.append("   Clien Fmt Chn mask   Session Buf  S SRate  Serv     User\n");          mActiveTrack->dump(buffer, SIZE);          result.append(buffer); @@ -4240,7 +4226,7 @@ void AudioFlinger::RecordThread::audioConfigChanged_l(int event, int param) {      switch (event) {      case AudioSystem::INPUT_OPENED:      case AudioSystem::INPUT_CONFIG_CHANGED: -        desc.channels = mChannels; +        desc.channels = mChannelMask;          desc.samplingRate = mSampleRate;          desc.format = mFormat;          desc.frameCount = mFrameCount; @@ -4263,8 +4249,8 @@ void AudioFlinger::RecordThread::readInputParameters()      mResampler = 0;      mSampleRate = mInput->stream->common.get_sample_rate(&mInput->stream->common); -    mChannels = mInput->stream->common.get_channels(&mInput->stream->common); -    mChannelCount = (uint16_t)popcount(mChannels); +    mChannelMask = mInput->stream->common.get_channels(&mInput->stream->common); +    mChannelCount = (uint16_t)popcount(mChannelMask);      mFormat = mInput->stream->common.get_format(&mInput->stream->common);      mFrameSize = (uint16_t)audio_stream_frame_size(&mInput->stream->common);      mInputBytes = mInput->stream->common.get_buffer_size(&mInput->stream->common); @@ -4636,32 +4622,6 @@ int AudioFlinger::nextUniqueId_l()  // ---------------------------------------------------------------------------- -status_t AudioFlinger::loadEffectLibrary(const char *libPath, int *handle) -{ -    // check calling permissions -    if (!settingsAllowed()) { -        return PERMISSION_DENIED; -    } -    // only allow libraries loaded from /system/lib/soundfx for now -    if (strncmp(gEffectLibPath, libPath, strlen(gEffectLibPath)) != 0) { -        return PERMISSION_DENIED; -    } - -    Mutex::Autolock _l(mLock); -    return EffectLoadLibrary(libPath, handle); -} - -status_t AudioFlinger::unloadEffectLibrary(int handle) -{ -    // check calling permissions -    if (!settingsAllowed()) { -        return PERMISSION_DENIED; -    } - -    Mutex::Autolock _l(mLock); -    return EffectUnloadLibrary(handle); -} -  status_t AudioFlinger::queryNumberEffects(uint32_t *numEffects)  {      Mutex::Autolock _l(mLock); @@ -4697,7 +4657,6 @@ sp<IEffect> AudioFlinger::createEffect(pid_t pid,  {      status_t lStatus = NO_ERROR;      sp<EffectHandle> handle; -    effect_interface_t itfe;      effect_descriptor_t desc;      sp<Client> client;      wp<Client> wclient; @@ -5535,19 +5494,19 @@ status_t AudioFlinger::EffectModule::configure()      // TODO: handle configuration of effects replacing track process      if (thread->channelCount() == 1) { -        channels = CHANNEL_MONO; +        channels = AUDIO_CHANNEL_OUT_MONO;      } else { -        channels = CHANNEL_STEREO; +        channels = AUDIO_CHANNEL_OUT_STEREO;      }      if ((mDescriptor.flags & EFFECT_FLAG_TYPE_MASK) == EFFECT_FLAG_TYPE_AUXILIARY) { -        mConfig.inputCfg.channels = CHANNEL_MONO; +        mConfig.inputCfg.channels = AUDIO_CHANNEL_OUT_MONO;      } else {          mConfig.inputCfg.channels = channels;      }      mConfig.outputCfg.channels = channels; -    mConfig.inputCfg.format = SAMPLE_FORMAT_PCM_S15; -    mConfig.outputCfg.format = SAMPLE_FORMAT_PCM_S15; +    mConfig.inputCfg.format = AUDIO_FORMAT_PCM_16_BIT; +    mConfig.outputCfg.format = AUDIO_FORMAT_PCM_16_BIT;      mConfig.inputCfg.samplingRate = thread->sampleRate();      mConfig.outputCfg.samplingRate = mConfig.inputCfg.samplingRate;      mConfig.inputCfg.bufferProvider.cookie = NULL; @@ -5792,11 +5751,6 @@ status_t AudioFlinger::EffectModule::setDevice(uint32_t device)      Mutex::Autolock _l(mLock);      status_t status = NO_ERROR;      if ((mDescriptor.flags & EFFECT_FLAG_DEVICE_MASK) == EFFECT_FLAG_DEVICE_IND) { -        // convert device bit field from AudioSystem to EffectApi format. -        device = deviceAudioSystemToEffectApi(device); -        if (device == 0) { -            return BAD_VALUE; -        }          status_t cmdStatus;          uint32_t size = sizeof(status_t);          status = (*mEffectInterface)->command(mEffectInterface, @@ -5817,17 +5771,12 @@ status_t AudioFlinger::EffectModule::setMode(uint32_t mode)      Mutex::Autolock _l(mLock);      status_t status = NO_ERROR;      if ((mDescriptor.flags & EFFECT_FLAG_AUDIO_MODE_MASK) == EFFECT_FLAG_AUDIO_MODE_IND) { -        // convert audio mode from AudioSystem to EffectApi format. -        int effectMode = modeAudioSystemToEffectApi(mode); -        if (effectMode < 0) { -            return BAD_VALUE; -        }          status_t cmdStatus;          uint32_t size = sizeof(status_t);          status = (*mEffectInterface)->command(mEffectInterface,                                                EFFECT_CMD_SET_AUDIO_MODE,                                                sizeof(int), -                                              &effectMode, +                                              &mode,                                                &size,                                                &cmdStatus);          if (status == NO_ERROR) { @@ -5837,53 +5786,6 @@ status_t AudioFlinger::EffectModule::setMode(uint32_t mode)      return status;  } -// update this table when AudioSystem::audio_devices or audio_device_e (in EffectApi.h) are modified -const uint32_t AudioFlinger::EffectModule::sDeviceConvTable[] = { -    DEVICE_EARPIECE, // AUDIO_DEVICE_OUT_EARPIECE -    DEVICE_SPEAKER, // AUDIO_DEVICE_OUT_SPEAKER -    DEVICE_WIRED_HEADSET, // case AUDIO_DEVICE_OUT_WIRED_HEADSET -    DEVICE_WIRED_HEADPHONE, // AUDIO_DEVICE_OUT_WIRED_HEADPHONE -    DEVICE_BLUETOOTH_SCO, // AUDIO_DEVICE_OUT_BLUETOOTH_SCO -    DEVICE_BLUETOOTH_SCO_HEADSET, // AUDIO_DEVICE_OUT_BLUETOOTH_SCO_HEADSET -    DEVICE_BLUETOOTH_SCO_CARKIT, //  AUDIO_DEVICE_OUT_BLUETOOTH_SCO_CARKIT -    DEVICE_BLUETOOTH_A2DP, //  AUDIO_DEVICE_OUT_BLUETOOTH_A2DP -    DEVICE_BLUETOOTH_A2DP_HEADPHONES, // AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES -    DEVICE_BLUETOOTH_A2DP_SPEAKER, // AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER -    DEVICE_AUX_DIGITAL // AUDIO_DEVICE_OUT_AUX_DIGITAL -}; - -uint32_t AudioFlinger::EffectModule::deviceAudioSystemToEffectApi(uint32_t device) -{ -    uint32_t deviceOut = 0; -    while (device) { -        const uint32_t i = 31 - __builtin_clz(device); -        device &= ~(1 << i); -        if (i >= sizeof(sDeviceConvTable)/sizeof(uint32_t)) { -            LOGE("device conversion error for AudioSystem device 0x%08x", device); -            return 0; -        } -        deviceOut |= (uint32_t)sDeviceConvTable[i]; -    } -    return deviceOut; -} - -// update this table when AudioSystem::audio_mode or audio_mode_e (in EffectApi.h) are modified -const uint32_t AudioFlinger::EffectModule::sModeConvTable[] = { -    AUDIO_EFFECT_MODE_NORMAL,   // AUDIO_MODE_NORMAL -    AUDIO_EFFECT_MODE_RINGTONE, // AUDIO_MODE_RINGTONE -    AUDIO_EFFECT_MODE_IN_CALL,  // AUDIO_MODE_IN_CALL -    AUDIO_EFFECT_MODE_IN_CALL   // AUDIO_MODE_IN_COMMUNICATION, same conversion as for AUDIO_MODE_IN_CALL -}; - -int AudioFlinger::EffectModule::modeAudioSystemToEffectApi(uint32_t mode) -{ -    int modeOut = -1; -    if (mode < sizeof(sModeConvTable) / sizeof(uint32_t)) { -        modeOut = (int)sModeConvTable[mode]; -    } -    return modeOut; -} -  status_t AudioFlinger::EffectModule::dump(int fd, const Vector<String16>& args)  {      const size_t SIZE = 256; @@ -5915,7 +5817,7 @@ status_t AudioFlinger::EffectModule::dump(int fd, const Vector<String16>& args)                  mDescriptor.type.clockSeq, mDescriptor.type.node[0], mDescriptor.type.node[1],mDescriptor.type.node[2],                  mDescriptor.type.node[3],mDescriptor.type.node[4],mDescriptor.type.node[5]);      result.append(buffer); -    snprintf(buffer, SIZE, "\t\t- apiVersion: %04X\n\t\t- flags: %08X\n", +    snprintf(buffer, SIZE, "\t\t- apiVersion: %08X\n\t\t- flags: %08X\n",              mDescriptor.apiVersion,              mDescriptor.flags);      result.append(buffer); diff --git a/services/audioflinger/AudioFlinger.h b/services/audioflinger/AudioFlinger.h index 39314ad..1fad987 100644 --- a/services/audioflinger/AudioFlinger.h +++ b/services/audioflinger/AudioFlinger.h @@ -39,7 +39,7 @@  #include <binder/MemoryDealer.h>  #include <system/audio.h> -#include <hardware/audio_hal.h> +#include <hardware/audio.h>  #include "AudioBufferProvider.h" @@ -76,8 +76,8 @@ public:                                  pid_t pid,                                  int streamType,                                  uint32_t sampleRate, -                                int format, -                                int channelCount, +                                uint32_t format, +                                uint32_t channelMask,                                  int frameCount,                                  uint32_t flags,                                  const sp<IMemory>& sharedBuffer, @@ -87,7 +87,7 @@ public:      virtual     uint32_t    sampleRate(int output) const;      virtual     int         channelCount(int output) const; -    virtual     int         format(int output) const; +    virtual     uint32_t    format(int output) const;      virtual     size_t      frameCount(int output) const;      virtual     uint32_t    latency(int output) const; @@ -147,10 +147,6 @@ public:      virtual int newAudioSessionId(); -    virtual status_t loadEffectLibrary(const char *libPath, int *handle); - -    virtual status_t unloadEffectLibrary(int handle); -      virtual status_t queryNumberEffects(uint32_t *numEffects);      virtual status_t queryEffect(uint32_t index, effect_descriptor_t *descriptor); @@ -193,8 +189,8 @@ public:                                  pid_t pid,                                  int input,                                  uint32_t sampleRate, -                                int format, -                                int channelCount, +                                uint32_t format, +                                uint32_t channelMask,                                  int frameCount,                                  uint32_t flags,                                  int *sessionId, @@ -305,8 +301,8 @@ private:                                  TrackBase(const wp<ThreadBase>& thread,                                          const sp<Client>& client,                                          uint32_t sampleRate, -                                        int format, -                                        int channelCount, +                                        uint32_t format, +                                        uint32_t channelMask,                                          int frameCount,                                          uint32_t flags,                                          const sp<IMemory>& sharedBuffer, @@ -333,12 +329,14 @@ private:              virtual status_t getNextBuffer(AudioBufferProvider::Buffer* buffer) = 0;              virtual void releaseBuffer(AudioBufferProvider::Buffer* buffer); -            int format() const { +            uint32_t format() const {                  return mFormat;              }              int channelCount() const ; +            uint32_t channelMask() const; +              int sampleRate() const;              void* getBuffer(uint32_t offset, uint32_t frames) const; @@ -364,9 +362,11 @@ private:              // we don't really need a lock for these              int                 mState;              int                 mClientTid; -            uint8_t             mFormat; +            uint32_t            mFormat;              uint32_t            mFlags;              int                 mSessionId; +            uint8_t             mChannelCount; +            uint32_t            mChannelMask;          };          class ConfigEvent { @@ -379,7 +379,7 @@ private:                      uint32_t    sampleRate() const;                      int         channelCount() const; -                    int         format() const; +                    uint32_t    format() const;                      size_t      frameCount() const;                      void        wakeUp()    { mWaitWorkCV.broadcast(); }                      void        exit(); @@ -410,10 +410,10 @@ private:                      sp<AudioFlinger>        mAudioFlinger;                      uint32_t                mSampleRate;                      size_t                  mFrameCount; -                    uint32_t                mChannels; +                    uint32_t                mChannelMask;                      uint16_t                mChannelCount;                      uint16_t                mFrameSize; -                    int                     mFormat; +                    uint32_t                mFormat;                      Condition               mParamCond;                      Vector<String8>         mNewParameters;                      status_t                mParamStatus; @@ -446,8 +446,8 @@ private:                                          const sp<Client>& client,                                          int streamType,                                          uint32_t sampleRate, -                                        int format, -                                        int channelCount, +                                        uint32_t format, +                                        uint32_t channelMask,                                          int frameCount,                                          const sp<IMemory>& sharedBuffer,                                          int sessionId); @@ -534,8 +534,8 @@ private:                                  OutputTrack(  const wp<ThreadBase>& thread,                                          DuplicatingThread *sourceThread,                                          uint32_t sampleRate, -                                        int format, -                                        int channelCount, +                                        uint32_t format, +                                        uint32_t channelMask,                                          int frameCount);                                  ~OutputTrack(); @@ -587,8 +587,8 @@ private:                                      const sp<AudioFlinger::Client>& client,                                      int streamType,                                      uint32_t sampleRate, -                                    int format, -                                    int channelCount, +                                    uint32_t format, +                                    uint32_t channelMask,                                      int frameCount,                                      const sp<IMemory>& sharedBuffer,                                      int sessionId, @@ -833,8 +833,8 @@ private:                                  RecordTrack(const wp<ThreadBase>& thread,                                          const sp<Client>& client,                                          uint32_t sampleRate, -                                        int format, -                                        int channelCount, +                                        uint32_t format, +                                        uint32_t channelMask,                                          int frameCount,                                          uint32_t flags,                                          int sessionId); @@ -1002,14 +1002,6 @@ private:          status_t start_l();          status_t stop_l(); -        // update this table when AudioSystem::audio_devices or audio_device_e (in EffectApi.h) are modified -        static const uint32_t sDeviceConvTable[]; -        static uint32_t deviceAudioSystemToEffectApi(uint32_t device); - -        // update this table when AudioSystem::audio_mode or audio_mode_e (in EffectApi.h) are modified -        static const uint32_t sModeConvTable[]; -        static int modeAudioSystemToEffectApi(uint32_t mode); -          Mutex               mLock;      // mutex for process, commands and handles list protection          wp<ThreadBase>      mThread;    // parent thread          wp<EffectChain>     mChain;     // parent effect chain @@ -1017,7 +1009,7 @@ private:          int                 mSessionId; // audio session ID          effect_descriptor_t mDescriptor;// effect descriptor received from effect engine          effect_config_t     mConfig;    // input and output audio configuration -        effect_interface_t  mEffectInterface; // Effect module C API +        effect_handle_t  mEffectInterface; // Effect module C API          status_t mStatus;               // initialization status          uint32_t mState;                // current activation state (effect_state)          Vector< wp<EffectHandle> > mHandles;    // list of client handles diff --git a/services/audioflinger/AudioMixer.cpp b/services/audioflinger/AudioMixer.cpp index 50dcda7..6e9319d 100644 --- a/services/audioflinger/AudioMixer.cpp +++ b/services/audioflinger/AudioMixer.cpp @@ -26,6 +26,10 @@  #include <utils/Errors.h>  #include <utils/Log.h> +#include <cutils/bitops.h> + +#include <system/audio.h> +  #include "AudioMixer.h"  namespace android { @@ -61,6 +65,7 @@ AudioMixer::AudioMixer(size_t frameCount, uint32_t sampleRate)          t->channelCount = 2;          t->enabled = 0;          t->format = 16; +        t->channelMask = AUDIO_CHANNEL_OUT_STEREO;          t->buffer.raw = 0;          t->bufferProvider = 0;          t->hook = 0; @@ -180,13 +185,18 @@ status_t AudioMixer::setParameter(int target, int name, void *value)      switch (target) {      case TRACK: -        if (name == CHANNEL_COUNT) { -            if ((uint32_t(valueInt) <= MAX_NUM_CHANNELS) && (valueInt)) { -                if (mState.tracks[ mActiveTrack ].channelCount != valueInt) { -                    mState.tracks[ mActiveTrack ].channelCount = valueInt; -                    LOGV("setParameter(TRACK, CHANNEL_COUNT, %d)", valueInt); +        if (name == CHANNEL_MASK) { +            uint32_t mask = (uint32_t)value; +            if (mState.tracks[ mActiveTrack ].channelMask != mask) { +                uint8_t channelCount = popcount(mask); +                if ((channelCount <= MAX_NUM_CHANNELS) && (channelCount)) { +                    mState.tracks[ mActiveTrack ].channelMask = mask; +                    mState.tracks[ mActiveTrack ].channelCount = channelCount; +                    LOGV("setParameter(TRACK, CHANNEL_MASK, %x)", mask);                      invalidateState(1<<mActiveTrack); +                    return NO_ERROR;                  } +            } else {                  return NO_ERROR;              }          } diff --git a/services/audioflinger/AudioMixer.h b/services/audioflinger/AudioMixer.h index 88408a7..75c9170 100644 --- a/services/audioflinger/AudioMixer.h +++ b/services/audioflinger/AudioMixer.h @@ -61,7 +61,7 @@ public:          // set Parameter names          // for target TRACK -        CHANNEL_COUNT   = 0x4000, +        CHANNEL_MASK    = 0x4000,          FORMAT          = 0x4001,          MAIN_BUFFER     = 0x4002,          AUX_BUFFER      = 0x4003, @@ -150,6 +150,7 @@ private:          uint8_t     enabled      : 1;          uint8_t     reserved0    : 3;          uint8_t     format; +        uint32_t    channelMask;          AudioBufferProvider*                bufferProvider;          mutable AudioBufferProvider::Buffer buffer; diff --git a/services/audioflinger/AudioPolicyService.cpp b/services/audioflinger/AudioPolicyService.cpp index ef8d957..47ca3a0 100644 --- a/services/audioflinger/AudioPolicyService.cpp +++ b/services/audioflinger/AudioPolicyService.cpp @@ -36,15 +36,8 @@  #include <hardware/hardware.h>  #include <system/audio.h> +#include <system/audio_policy.h>  #include <hardware/audio_policy.h> -#include <hardware/audio_policy_hal.h> - -// ---------------------------------------------------------------------------- -// the sim build doesn't have gettid - -#ifndef HAVE_GETTID -# define gettid getpid -#endif  namespace android { diff --git a/services/audioflinger/AudioPolicyService.h b/services/audioflinger/AudioPolicyService.h index d9b5ada..b830120 100644 --- a/services/audioflinger/AudioPolicyService.h +++ b/services/audioflinger/AudioPolicyService.h @@ -23,8 +23,8 @@  #include <binder/BinderService.h>  #include <system/audio.h> +#include <system/audio_policy.h>  #include <hardware/audio_policy.h> -#include <hardware/audio_policy_hal.h>  namespace android { diff --git a/services/camera/libcameraservice/CameraHardwareInterface.h b/services/camera/libcameraservice/CameraHardwareInterface.h index f9fa30e..a3749cf 100644 --- a/services/camera/libcameraservice/CameraHardwareInterface.h +++ b/services/camera/libcameraservice/CameraHardwareInterface.h @@ -438,18 +438,23 @@ private:      }      static void __data_cb(int32_t msg_type, -                          const camera_memory_t *data, +                          const camera_memory_t *data, unsigned int index,                            void *user)      {          LOGV("%s", __FUNCTION__);          CameraHardwareInterface *__this =                  static_cast<CameraHardwareInterface *>(user);          sp<CameraHeapMemory> mem(static_cast<CameraHeapMemory *>(data->handle)); -        __this->mDataCb(msg_type, mem, __this->mCbUser); +        if (index >= mem->mNumBufs) { +            LOGE("%s: invalid buffer index %d, max allowed is %d", __FUNCTION__, +                 index, mem->mNumBufs); +            return; +        } +        __this->mDataCb(msg_type, mem->mBuffers[index], __this->mCbUser);      }      static void __data_cb_timestamp(nsecs_t timestamp, int32_t msg_type, -                             const camera_memory_t *data, +                             const camera_memory_t *data, unsigned index,                               void *user)      {          LOGV("%s", __FUNCTION__); @@ -459,38 +464,85 @@ private:          // drop all references, it will be destroyed (as well as the enclosed          // MemoryHeapBase.          sp<CameraHeapMemory> mem(static_cast<CameraHeapMemory *>(data->handle)); -        __this->mDataCbTimestamp(timestamp, msg_type, mem, __this->mCbUser); +        if (index >= mem->mNumBufs) { +            LOGE("%s: invalid buffer index %d, max allowed is %d", __FUNCTION__, +                 index, mem->mNumBufs); +            return; +        } +        __this->mDataCbTimestamp(timestamp, msg_type, mem->mBuffers[index], __this->mCbUser);      }      // This is a utility class that combines a MemoryHeapBase and a MemoryBase      // in one.  Since we tend to use them in a one-to-one relationship, this is      // handy. -    class CameraHeapMemory : public MemoryBase { +    class CameraHeapMemory : public RefBase {      public: -        CameraHeapMemory(size_t size) : -            MemoryBase(new MemoryHeapBase(size), 0, size) +        CameraHeapMemory(int fd, size_t buf_size, uint_t num_buffers = 1) : +                         mBufSize(buf_size), +                         mNumBufs(num_buffers) +        { +            mHeap = new MemoryHeapBase(fd, buf_size * num_buffers); +            commonInitialization(); +        } + +        CameraHeapMemory(size_t buf_size, uint_t num_buffers = 1) : +                         mBufSize(buf_size), +                         mNumBufs(num_buffers)          { -            handle.data = getHeap()->base(); -            handle.size = size; +            mHeap = new MemoryHeapBase(buf_size * num_buffers); +            commonInitialization(); +        } + +        void commonInitialization() +        { +            handle.data = mHeap->base(); +            handle.size = mBufSize * mNumBufs;              handle.handle = this; + +            mBuffers = new sp<MemoryBase>[mNumBufs]; +            for (uint_t i = 0; i < mNumBufs; i++) +                mBuffers[i] = new MemoryBase(mHeap, +                                             i * mBufSize, +                                             mBufSize); + +            handle.release = __put_memory;          } +        virtual ~CameraHeapMemory() +        { +            delete [] mBuffers; +        } + +        size_t mBufSize; +        uint_t mNumBufs; +        sp<MemoryHeapBase> mHeap; +        sp<MemoryBase> *mBuffers; +          camera_memory_t handle;      }; -    static camera_memory_t* __get_memory(size_t size, -                                    void *user __attribute__((unused))) +    static camera_memory_t* __get_memory(int fd, size_t buf_size, uint_t num_bufs, +                                         void *user __attribute__((unused)))      { -        // We allocate the object here, but we do not assign it to a strong -        // pointer yet.  The HAL will pass it back to us via the data callback -        // or the data-timestamp callback, and from there on we will wrap it -        // within a strong pointer. - -        CameraHeapMemory *mem = new CameraHeapMemory(size); +        CameraHeapMemory *mem; +        if (fd < 0) +            mem = new CameraHeapMemory(buf_size, num_bufs); +        else +            mem = new CameraHeapMemory(fd, buf_size, num_bufs); +        mem->incStrong(mem);          return &mem->handle;      } +    static void __put_memory(camera_memory_t *data) +    { +        if (!data) +            return; + +        CameraHeapMemory *mem = static_cast<CameraHeapMemory *>(data->handle); +        mem->decStrong(mem); +    } +      static ANativeWindow *__to_anw(void *user)      {          CameraHardwareInterface *__this = @@ -500,7 +552,7 @@ private:  #define anw(n) __to_anw(((struct camera_preview_window *)n)->user)      static int __dequeue_buffer(struct preview_stream_ops* w, -                      buffer_handle_t** buffer) +                                buffer_handle_t** buffer, int *stride)      {          int rc;          ANativeWindow *a = anw(w); @@ -508,8 +560,10 @@ private:          rc = a->dequeueBuffer(a, &anb);          if (!rc) {              rc = a->lockBuffer(a, anb); -            if (!rc) +            if (!rc) {                  *buffer = &anb->handle; +                *stride = anb->stride; +            }              else                  a->cancelBuffer(a, anb);          } @@ -541,7 +595,7 @@ private:      static int __set_buffer_count(struct preview_stream_ops* w, int count)      {          ANativeWindow *a = anw(w); -	return native_window_set_buffer_count(a, count); +        return native_window_set_buffer_count(a, count);      }      static int __set_buffers_geometry(struct preview_stream_ops* w,  | 
