diff options
-rw-r--r-- | cmds/stagefright/codec.cpp | 57 | ||||
-rw-r--r-- | drm/libdrmframework/plugins/forward-lock/internal-format/decoder/FwdLockFile.c | 9 | ||||
-rw-r--r-- | include/media/AudioRecord.h | 8 | ||||
-rw-r--r-- | include/media/AudioTrack.h | 12 | ||||
-rw-r--r-- | include/media/IAudioFlinger.h | 3 | ||||
-rw-r--r-- | media/libmedia/AudioRecord.cpp | 4 | ||||
-rw-r--r-- | media/libmedia/AudioTrack.cpp | 17 | ||||
-rw-r--r-- | media/libmedia/IAudioFlinger.cpp | 6 | ||||
-rw-r--r-- | media/libmedia/JetPlayer.cpp | 2 | ||||
-rw-r--r-- | media/libmedia/ToneGenerator.cpp | 2 | ||||
-rw-r--r-- | media/libmediaplayerservice/MediaPlayerService.cpp | 4 | ||||
-rw-r--r-- | media/libstagefright/AudioPlayer.cpp | 11 | ||||
-rw-r--r-- | media/libstagefright/AudioSource.cpp | 5 | ||||
-rw-r--r-- | media/libstagefright/codecs/aacenc/src/adj_thr.c | 4 | ||||
-rw-r--r-- | media/libstagefright/codecs/amrwbenc/inc/basic_op.h | 4 | ||||
-rw-r--r-- | media/libstagefright/foundation/AMessage.cpp | 6 | ||||
-rw-r--r-- | services/audioflinger/AudioFlinger.cpp | 10 | ||||
-rw-r--r-- | services/audioflinger/AudioFlinger.h | 11 |
18 files changed, 103 insertions, 72 deletions
diff --git a/cmds/stagefright/codec.cpp b/cmds/stagefright/codec.cpp index 0414b98..fea62cc 100644 --- a/cmds/stagefright/codec.cpp +++ b/cmds/stagefright/codec.cpp @@ -49,6 +49,7 @@ struct CodecState { size_t mCSDIndex; Vector<sp<ABuffer> > mInBuffers; Vector<sp<ABuffer> > mOutBuffers; + bool mSignalledInputEOS; bool mSawOutputEOS; int64_t mNumBuffersDecoded; int64_t mNumBytesDecoded; @@ -127,6 +128,7 @@ static int decode( } state->mCSDIndex = 0; + state->mSignalledInputEOS = false; state->mSawOutputEOS = false; ALOGV("got %d pieces of codec specific data.", state->mCSD.size()); @@ -180,33 +182,7 @@ static int decode( status_t err = extractor->getSampleTrackIndex(&trackIndex); if (err != OK) { - ALOGV("signalling EOS."); - - for (size_t i = 0; i < stateByTrack.size(); ++i) { - CodecState *state = &stateByTrack.editValueAt(i); - - for (;;) { - size_t index; - err = state->mCodec->dequeueInputBuffer(&index, kTimeout); - - if (err == -EAGAIN) { - continue; - } - - CHECK_EQ(err, (status_t)OK); - - err = state->mCodec->queueInputBuffer( - index, - 0 /* offset */, - 0 /* size */, - 0ll /* timeUs */, - MediaCodec::BUFFER_FLAG_EOS); - - CHECK_EQ(err, (status_t)OK); - break; - } - } - + ALOGV("saw input eos"); sawInputEOS = true; } else { CodecState *state = &stateByTrack.editValueFor(trackIndex); @@ -240,6 +216,33 @@ static int decode( CHECK_EQ(err, -EAGAIN); } } + } else { + for (size_t i = 0; i < stateByTrack.size(); ++i) { + CodecState *state = &stateByTrack.editValueAt(i); + + if (!state->mSignalledInputEOS) { + size_t index; + status_t err = + state->mCodec->dequeueInputBuffer(&index, kTimeout); + + if (err == OK) { + ALOGV("signalling input EOS on track %d", i); + + err = state->mCodec->queueInputBuffer( + index, + 0 /* offset */, + 0 /* size */, + 0ll /* timeUs */, + MediaCodec::BUFFER_FLAG_EOS); + + CHECK_EQ(err, (status_t)OK); + + state->mSignalledInputEOS = true; + } else { + CHECK_EQ(err, -EAGAIN); + } + } + } } bool sawOutputEOSOnAllTracks = true; diff --git a/drm/libdrmframework/plugins/forward-lock/internal-format/decoder/FwdLockFile.c b/drm/libdrmframework/plugins/forward-lock/internal-format/decoder/FwdLockFile.c index dacf00e..365bdec 100644 --- a/drm/libdrmframework/plugins/forward-lock/internal-format/decoder/FwdLockFile.c +++ b/drm/libdrmframework/plugins/forward-lock/internal-format/decoder/FwdLockFile.c @@ -14,6 +14,7 @@ * limitations under the License. */ +#include <utils/Log.h> #include <assert.h> #include <errno.h> #include <fcntl.h> @@ -107,6 +108,7 @@ static int FwdLockFile_AcquireSession(int fileDesc) { } pthread_mutex_unlock(&sessionAcquisitionMutex); if (i == MAX_NUM_SESSIONS) { + ALOGE("Too many sessions opened at the same time"); errno = ENFILE; } } @@ -293,7 +295,12 @@ int FwdLockFile_attach(int fileDesc) { int FwdLockFile_open(const char *pFilename) { int fileDesc = open(pFilename, O_RDONLY); - if (fileDesc >= 0 && FwdLockFile_attach(fileDesc) < 0) { + if (fileDesc < 0) { + ALOGE("failed to open file '%s': %s", pFilename, strerror(errno)); + return fileDesc; + } + + if (FwdLockFile_attach(fileDesc) < 0) { (void)close(fileDesc); fileDesc = -1; } diff --git a/include/media/AudioRecord.h b/include/media/AudioRecord.h index 4fbeb38..7df6668 100644 --- a/include/media/AudioRecord.h +++ b/include/media/AudioRecord.h @@ -143,6 +143,8 @@ public: * user Context for use by the callback receiver. */ + // FIXME consider removing this alias and replacing it by audio_in_acoustics_t + // or removing the parameter entirely if it is unused enum record_flags { RECORD_AGC_ENABLE = AUDIO_IN_ACOUSTICS_AGC_ENABLE, RECORD_NS_ENABLE = AUDIO_IN_ACOUSTICS_NS_ENABLE, @@ -154,7 +156,7 @@ public: audio_format_t format = AUDIO_FORMAT_DEFAULT, uint32_t channelMask = AUDIO_CHANNEL_IN_MONO, int frameCount = 0, - uint32_t flags = 0, + record_flags flags = (record_flags) 0, callback_t cbf = NULL, void* user = NULL, int notificationFrames = 0, @@ -180,7 +182,7 @@ public: audio_format_t format = AUDIO_FORMAT_DEFAULT, uint32_t channelMask = AUDIO_CHANNEL_IN_MONO, int frameCount = 0, - uint32_t flags = 0, + record_flags flags = (record_flags) 0, callback_t cbf = NULL, void* user = NULL, int notificationFrames = 0, @@ -383,7 +385,7 @@ private: bool mMarkerReached; uint32_t mNewPosition; uint32_t mUpdatePeriod; - uint32_t mFlags; + record_flags mFlags; uint32_t mChannelMask; audio_io_handle_t mInput; int mSessionId; diff --git a/include/media/AudioTrack.h b/include/media/AudioTrack.h index 95b9d86..552e829 100644 --- a/include/media/AudioTrack.h +++ b/include/media/AudioTrack.h @@ -153,7 +153,7 @@ public: audio_format_t format = AUDIO_FORMAT_DEFAULT, int channelMask = 0, int frameCount = 0, - uint32_t flags = 0, + audio_policy_output_flags_t flags = AUDIO_POLICY_OUTPUT_FLAG_NONE, callback_t cbf = NULL, void* user = NULL, int notificationFrames = 0, @@ -165,7 +165,7 @@ public: int format = AUDIO_FORMAT_DEFAULT, int channelMask = 0, int frameCount = 0, - uint32_t flags = 0, + uint32_t flags = (uint32_t) AUDIO_POLICY_OUTPUT_FLAG_NONE, callback_t cbf = 0, void* user = 0, int notificationFrames = 0, @@ -185,7 +185,7 @@ public: audio_format_t format = AUDIO_FORMAT_DEFAULT, int channelMask = 0, const sp<IMemory>& sharedBuffer = 0, - uint32_t flags = 0, + audio_policy_output_flags_t flags = AUDIO_POLICY_OUTPUT_FLAG_NONE, callback_t cbf = NULL, void* user = NULL, int notificationFrames = 0, @@ -209,7 +209,7 @@ public: audio_format_t format = AUDIO_FORMAT_DEFAULT, int channelMask = 0, int frameCount = 0, - uint32_t flags = 0, + audio_policy_output_flags_t flags = AUDIO_POLICY_OUTPUT_FLAG_NONE, callback_t cbf = NULL, void* user = NULL, int notificationFrames = 0, @@ -473,7 +473,7 @@ protected: audio_format_t format, uint32_t channelMask, int frameCount, - uint32_t flags, + audio_policy_output_flags_t flags, const sp<IMemory>& sharedBuffer, audio_io_handle_t output, bool enforceFrameCount); @@ -515,7 +515,7 @@ protected: uint32_t mNewPosition; uint32_t mUpdatePeriod; bool mFlushed; // FIXME will be made obsolete by making flush() synchronous - uint32_t mFlags; + audio_policy_output_flags_t mFlags; int mSessionId; int mAuxEffectId; mutable Mutex mLock; diff --git a/include/media/IAudioFlinger.h b/include/media/IAudioFlinger.h index 7a2ada0..c723b6d 100644 --- a/include/media/IAudioFlinger.h +++ b/include/media/IAudioFlinger.h @@ -28,6 +28,7 @@ #include <media/IAudioRecord.h> #include <media/IAudioFlingerClient.h> #include <system/audio.h> +#include <system/audio_policy.h> #include <hardware/audio_effect.h> #include <media/IEffect.h> #include <media/IEffectClient.h> @@ -121,7 +122,7 @@ public: audio_format_t *pFormat, uint32_t *pChannels, uint32_t *pLatencyMs, - uint32_t flags) = 0; + audio_policy_output_flags_t flags) = 0; virtual audio_io_handle_t openDuplicateOutput(audio_io_handle_t output1, audio_io_handle_t output2) = 0; virtual status_t closeOutput(audio_io_handle_t output) = 0; diff --git a/media/libmedia/AudioRecord.cpp b/media/libmedia/AudioRecord.cpp index 943f3af..22c3a18 100644 --- a/media/libmedia/AudioRecord.cpp +++ b/media/libmedia/AudioRecord.cpp @@ -89,7 +89,7 @@ AudioRecord::AudioRecord( audio_format_t format, uint32_t channelMask, int frameCount, - uint32_t flags, + record_flags flags, callback_t cbf, void* user, int notificationFrames, @@ -124,7 +124,7 @@ status_t AudioRecord::set( audio_format_t format, uint32_t channelMask, int frameCount, - uint32_t flags, + record_flags flags, callback_t cbf, void* user, int notificationFrames, diff --git a/media/libmedia/AudioTrack.cpp b/media/libmedia/AudioTrack.cpp index a1c99e5..34563ca 100644 --- a/media/libmedia/AudioTrack.cpp +++ b/media/libmedia/AudioTrack.cpp @@ -92,7 +92,7 @@ AudioTrack::AudioTrack( audio_format_t format, int channelMask, int frameCount, - uint32_t flags, + audio_policy_output_flags_t flags, callback_t cbf, void* user, int notificationFrames, @@ -119,10 +119,11 @@ AudioTrack::AudioTrack( int notificationFrames, int sessionId) : mStatus(NO_INIT), + mIsTimed(false), mPreviousPriority(ANDROID_PRIORITY_NORMAL), mPreviousSchedulingGroup(ANDROID_TGROUP_DEFAULT) { mStatus = set((audio_stream_type_t)streamType, sampleRate, (audio_format_t)format, channelMask, - frameCount, flags, cbf, user, notificationFrames, + frameCount, (audio_policy_output_flags_t)flags, cbf, user, notificationFrames, 0, false, sessionId); } @@ -132,7 +133,7 @@ AudioTrack::AudioTrack( audio_format_t format, int channelMask, const sp<IMemory>& sharedBuffer, - uint32_t flags, + audio_policy_output_flags_t flags, callback_t cbf, void* user, int notificationFrames, @@ -172,7 +173,7 @@ status_t AudioTrack::set( audio_format_t format, int channelMask, int frameCount, - uint32_t flags, + audio_policy_output_flags_t flags, callback_t cbf, void* user, int notificationFrames, @@ -221,7 +222,7 @@ status_t AudioTrack::set( // force direct flag if format is not linear PCM if (!audio_is_linear_pcm(format)) { - flags |= AUDIO_POLICY_OUTPUT_FLAG_DIRECT; + flags = (audio_policy_output_flags_t) (flags | AUDIO_POLICY_OUTPUT_FLAG_DIRECT); } if (!audio_is_output_channel(channelMask)) { @@ -233,7 +234,7 @@ status_t AudioTrack::set( audio_io_handle_t output = AudioSystem::getOutput( streamType, sampleRate, format, channelMask, - (audio_policy_output_flags_t)flags); + flags); if (output == 0) { ALOGE("Could not get audio output for stream type %d", streamType); @@ -707,7 +708,7 @@ audio_io_handle_t AudioTrack::getOutput() audio_io_handle_t AudioTrack::getOutput_l() { return AudioSystem::getOutput(mStreamType, - mCblk->sampleRate, mFormat, mChannelMask, (audio_policy_output_flags_t)mFlags); + mCblk->sampleRate, mFormat, mChannelMask, mFlags); } int AudioTrack::getSessionId() const @@ -734,7 +735,7 @@ status_t AudioTrack::createTrack_l( audio_format_t format, uint32_t channelMask, int frameCount, - uint32_t flags, + audio_policy_output_flags_t flags, const sp<IMemory>& sharedBuffer, audio_io_handle_t output, bool enforceFrameCount) diff --git a/media/libmedia/IAudioFlinger.cpp b/media/libmedia/IAudioFlinger.cpp index ebadbfa..47c261d 100644 --- a/media/libmedia/IAudioFlinger.cpp +++ b/media/libmedia/IAudioFlinger.cpp @@ -362,7 +362,7 @@ public: audio_format_t *pFormat, uint32_t *pChannels, uint32_t *pLatencyMs, - uint32_t flags) + audio_policy_output_flags_t flags) { Parcel data, reply; uint32_t devices = pDevices ? *pDevices : 0; @@ -377,7 +377,7 @@ public: data.writeInt32(format); data.writeInt32(channels); data.writeInt32(latency); - data.writeInt32(flags); + data.writeInt32((int32_t) flags); remote()->transact(OPEN_OUTPUT, data, &reply); audio_io_handle_t output = (audio_io_handle_t) reply.readInt32(); ALOGV("openOutput() returned output, %d", output); @@ -845,7 +845,7 @@ status_t BnAudioFlinger::onTransact( audio_format_t format = (audio_format_t) data.readInt32(); uint32_t channels = data.readInt32(); uint32_t latency = data.readInt32(); - uint32_t flags = data.readInt32(); + audio_policy_output_flags_t flags = (audio_policy_output_flags_t) data.readInt32(); audio_io_handle_t output = openOutput(&devices, &samplingRate, &format, diff --git a/media/libmedia/JetPlayer.cpp b/media/libmedia/JetPlayer.cpp index 6cb5b82..a85956c 100644 --- a/media/libmedia/JetPlayer.cpp +++ b/media/libmedia/JetPlayer.cpp @@ -94,7 +94,7 @@ int JetPlayer::init() AUDIO_FORMAT_PCM_16_BIT, (pLibConfig->numChannels == 2) ? AUDIO_CHANNEL_OUT_STEREO : AUDIO_CHANNEL_OUT_MONO, mTrackBufferSize, - 0); + AUDIO_POLICY_OUTPUT_FLAG_NONE); // create render and playback thread { diff --git a/media/libmedia/ToneGenerator.cpp b/media/libmedia/ToneGenerator.cpp index 54eb98a..9c3170c 100644 --- a/media/libmedia/ToneGenerator.cpp +++ b/media/libmedia/ToneGenerator.cpp @@ -1024,7 +1024,7 @@ bool ToneGenerator::initAudioTrack() { AUDIO_FORMAT_PCM_16_BIT, AUDIO_CHANNEL_OUT_MONO, 0, - 0, + AUDIO_POLICY_OUTPUT_FLAG_NONE, audioCallback, this, 0, diff --git a/media/libmediaplayerservice/MediaPlayerService.cpp b/media/libmediaplayerservice/MediaPlayerService.cpp index 1a85c9c..bbc53f3 100644 --- a/media/libmediaplayerservice/MediaPlayerService.cpp +++ b/media/libmediaplayerservice/MediaPlayerService.cpp @@ -1503,7 +1503,7 @@ status_t MediaPlayerService::AudioOutput::open( format, channelMask, frameCount, - 0 /* flags */, + AUDIO_POLICY_OUTPUT_FLAG_NONE, CallbackWrapper, this, 0, @@ -1515,7 +1515,7 @@ status_t MediaPlayerService::AudioOutput::open( format, channelMask, frameCount, - 0, + AUDIO_POLICY_OUTPUT_FLAG_NONE, NULL, NULL, 0, diff --git a/media/libstagefright/AudioPlayer.cpp b/media/libstagefright/AudioPlayer.cpp index 650b6c4..23c3c74 100644 --- a/media/libstagefright/AudioPlayer.cpp +++ b/media/libstagefright/AudioPlayer.cpp @@ -151,7 +151,7 @@ status_t AudioPlayer::start(bool sourceAlreadyStarted) { mAudioTrack = new AudioTrack( AUDIO_STREAM_MUSIC, mSampleRate, AUDIO_FORMAT_PCM_16_BIT, audioMask, - 0, 0, &AudioCallback, this, 0); + 0, AUDIO_POLICY_OUTPUT_FLAG_NONE, &AudioCallback, this, 0); if ((err = mAudioTrack->initCheck()) != OK) { delete mAudioTrack; @@ -437,8 +437,11 @@ size_t AudioPlayer::fillBuffer(void *data, size_t size) { kKeyTime, &mPositionTimeMediaUs)); mPositionTimeRealUs = - ((mNumFramesPlayed + size_done / mFrameSize) * 1000000) + -mLatencyUs + ((mNumFramesPlayed + size_done / mFrameSize) * 1000000) / mSampleRate; + if (mPositionTimeRealUs < 0) { + mPositionTimeRealUs = 0; + } ALOGV("buffer->size() = %d, " "mPositionTimeMediaUs=%.2f mPositionTimeRealUs=%.2f", @@ -493,7 +496,9 @@ int64_t AudioPlayer::getRealTimeUs() { int64_t AudioPlayer::getRealTimeUsLocked() const { CHECK(mStarted); CHECK_NE(mSampleRate, 0); - return -mLatencyUs + (mNumFramesPlayed * 1000000) / mSampleRate; + int64_t t = -mLatencyUs + (mNumFramesPlayed * 1000000) / mSampleRate; + if (t < 0) return 0; + return t; } int64_t AudioPlayer::getMediaTimeUs() { diff --git a/media/libstagefright/AudioSource.cpp b/media/libstagefright/AudioSource.cpp index 5b2ea1f..cbe709b 100644 --- a/media/libstagefright/AudioSource.cpp +++ b/media/libstagefright/AudioSource.cpp @@ -56,9 +56,10 @@ AudioSource::AudioSource( ALOGV("sampleRate: %d, channels: %d", sampleRate, channels); CHECK(channels == 1 || channels == 2); - uint32_t flags = AudioRecord::RECORD_AGC_ENABLE | + AudioRecord::record_flags flags = (AudioRecord::record_flags) + (AudioRecord::RECORD_AGC_ENABLE | AudioRecord::RECORD_NS_ENABLE | - AudioRecord::RECORD_IIR_ENABLE; + AudioRecord::RECORD_IIR_ENABLE); mRecord = new AudioRecord( inputSource, sampleRate, AUDIO_FORMAT_PCM_16_BIT, channels > 1? AUDIO_CHANNEL_IN_STEREO: AUDIO_CHANNEL_IN_MONO, diff --git a/media/libstagefright/codecs/aacenc/src/adj_thr.c b/media/libstagefright/codecs/aacenc/src/adj_thr.c index 373b063..07b33b7 100644 --- a/media/libstagefright/codecs/aacenc/src/adj_thr.c +++ b/media/libstagefright/codecs/aacenc/src/adj_thr.c @@ -438,7 +438,7 @@ static void correctThresh(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS], for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) { Word32 redThrExp = thrExp[ch][sfbGrp+sfb] + redVal; - if (((*pahFlag < AH_ACTIVE) || (deltaPe > 0)) && (redThrExp > 0) ) { + if (((*pahFlag < AH_ACTIVE) || (deltaPe > 0)) && (redThrExp > 0) && (redThrExp >= *psfbNActiveLines)) { *psfbPeFactors = (*psfbNActiveLines) * (0x7fffffff / redThrExp); normFactor = L_add(normFactor, *psfbPeFactors); @@ -466,7 +466,7 @@ static void correctThresh(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS], deltaSfbPe = *psfbPeFactors * deltaPe; /* thr3(n) = thr2(n)*2^deltaSfbPe/b(n) */ - if (*psfbNActiveLines > 0) { + if (*psfbNActiveLines > 0 && (normFactor* (*psfbNActiveLines)) != 0) { /* new threshold */ Word32 thrFactor; sfbEn = psyOutChan->sfbEnergy[sfbGrp+sfb]; diff --git a/media/libstagefright/codecs/amrwbenc/inc/basic_op.h b/media/libstagefright/codecs/amrwbenc/inc/basic_op.h index c23dce6..f42a27c 100644 --- a/media/libstagefright/codecs/amrwbenc/inc/basic_op.h +++ b/media/libstagefright/codecs/amrwbenc/inc/basic_op.h @@ -29,11 +29,7 @@ #define MIN_16 (Word16)-32768 /* 0x8000 */ -#ifdef LINUX -#define static_vo static __inline__ -#else #define static_vo static __inline -#endif #define saturate(L_var1) (((L_var1) > 0X00007fffL) ? (MAX_16): (((L_var1) < (Word32) 0xffff8000L) ? (MIN_16): ((L_var1) & 0xffff))) diff --git a/media/libstagefright/foundation/AMessage.cpp b/media/libstagefright/foundation/AMessage.cpp index 9a00186..8b01ac6 100644 --- a/media/libstagefright/foundation/AMessage.cpp +++ b/media/libstagefright/foundation/AMessage.cpp @@ -74,6 +74,7 @@ void AMessage::freeItem(Item *item) { case kTypeObject: case kTypeMessage: + case kTypeBuffer: { if (item->u.refValue != NULL) { item->u.refValue->decStrong(this); @@ -292,6 +293,7 @@ sp<AMessage> AMessage::dup() const { } case kTypeObject: + case kTypeBuffer: { to->u.refValue = from->u.refValue; to->u.refValue->incStrong(msg.get()); @@ -396,6 +398,10 @@ AString AMessage::debugString(int32_t indent) const { tmp = StringPrintf( "RefBase *%s = %p", item.mName, item.u.refValue); break; + case kTypeBuffer: + tmp = StringPrintf( + "ABuffer *%s = %p", item.mName, item.u.refValue); + break; case kTypeMessage: tmp = StringPrintf( "AMessage %s = %s", diff --git a/services/audioflinger/AudioFlinger.cpp b/services/audioflinger/AudioFlinger.cpp index f9b033b..f94ab84 100644 --- a/services/audioflinger/AudioFlinger.cpp +++ b/services/audioflinger/AudioFlinger.cpp @@ -5192,8 +5192,8 @@ bool AudioFlinger::RecordThread::checkForNewParameters_l() reqFormat == mInput->stream->common.get_format(&mInput->stream->common) && reqFormat == AUDIO_FORMAT_PCM_16_BIT && ((int)mInput->stream->common.get_sample_rate(&mInput->stream->common) <= (2 * reqSamplingRate)) && - (popcount(mInput->stream->common.get_channels(&mInput->stream->common)) < 3) && - (reqChannelCount < 3)) { + popcount(mInput->stream->common.get_channels(&mInput->stream->common)) <= FCC_2 && + (reqChannelCount <= FCC_2)) { status = NO_ERROR; } if (status == NO_ERROR) { @@ -5270,7 +5270,7 @@ void AudioFlinger::RecordThread::readInputParameters() mFrameCount = mInputBytes / mFrameSize; mRsmpInBuffer = new int16_t[mFrameCount * mChannelCount]; - if (mSampleRate != mReqSampleRate && mChannelCount < 3 && mReqChannelCount < 3) + if (mSampleRate != mReqSampleRate && mChannelCount <= FCC_2 && mReqChannelCount <= FCC_2) { int channelCount; // optmization: if mono to mono, use the resampler in stereo to stereo mode to avoid @@ -5356,7 +5356,7 @@ audio_io_handle_t AudioFlinger::openOutput(uint32_t *pDevices, audio_format_t *pFormat, uint32_t *pChannels, uint32_t *pLatencyMs, - uint32_t flags) + audio_policy_output_flags_t flags) { status_t status; PlaybackThread *thread = NULL; @@ -5559,7 +5559,7 @@ audio_io_handle_t AudioFlinger::openInput(uint32_t *pDevices, if (inStream == NULL && status == BAD_VALUE && reqFormat == format && format == AUDIO_FORMAT_PCM_16_BIT && (samplingRate <= 2 * reqSamplingRate) && - (popcount(channels) < 3) && (popcount(reqChannels) < 3)) { + (popcount(channels) <= FCC_2) && (popcount(reqChannels) <= FCC_2)) { ALOGV("openInput() reopening with proposed sampling rate and channels"); status = inHwDev->open_input_stream(inHwDev, *pDevices, &format, &channels, &samplingRate, diff --git a/services/audioflinger/AudioFlinger.h b/services/audioflinger/AudioFlinger.h index 2e259c0..38fff8c 100644 --- a/services/audioflinger/AudioFlinger.h +++ b/services/audioflinger/AudioFlinger.h @@ -58,6 +58,15 @@ class AudioResampler; // ---------------------------------------------------------------------------- +// AudioFlinger has a hard-coded upper limit of 2 channels for capture and playback. +// There is support for > 2 channel tracks down-mixed to 2 channel output via a down-mix effect. +// Adding full support for > 2 channel capture or playback would require more than simply changing +// this #define. There is an independent hard-coded upper limit in AudioMixer; +// removing that AudioMixer limit would be necessary but insufficient to support > 2 channels. +// The macro FCC_2 highlights some (but not all) places where there is are 2-channel assumptions. +// Search also for "2", "left", "right", "[0]", "[1]", ">> 16", "<< 16", etc. +#define FCC_2 2 // FCC_2 = Fixed Channel Count 2 + static const nsecs_t kDefaultStandbyTimeInNsecs = seconds(3); class AudioFlinger : @@ -134,7 +143,7 @@ public: audio_format_t *pFormat, uint32_t *pChannels, uint32_t *pLatencyMs, - uint32_t flags); + audio_policy_output_flags_t flags); virtual audio_io_handle_t openDuplicateOutput(audio_io_handle_t output1, audio_io_handle_t output2); |