diff options
author | 2010-02-26 02:47:27 -0800 | |
---|---|---|
committer | 2010-03-02 08:20:13 -0800 | |
commit | 47d0a9264fa5297db6333697ad750e6bc06822aa (patch) | |
tree | 2b688202179ab906b44a413b8b27fd1a0ae9f75a | |
parent | 04218254ec1129e329cac71479b309cfb8a28d88 (diff) |
Issue 2071329: audio track is shorter than video track for video capture on sholes
Add API to retrieve number of frames dropped by audio input kernel driver.
Submitted on behalf of Masaki Sato <masaki.sato@motorola.com>
-rw-r--r-- | include/media/AudioRecord.h | 8 | ||||
-rw-r--r-- | include/media/AudioSystem.h | 1 | ||||
-rw-r--r-- | include/media/IAudioFlinger.h | 3 | ||||
-rw-r--r-- | libs/audioflinger/AudioDumpInterface.cpp | 6 | ||||
-rw-r--r-- | libs/audioflinger/AudioDumpInterface.h | 1 | ||||
-rw-r--r-- | libs/audioflinger/AudioFlinger.cpp | 20 | ||||
-rw-r--r-- | libs/audioflinger/AudioFlinger.h | 2 | ||||
-rw-r--r-- | libs/audioflinger/AudioHardwareGeneric.h | 1 | ||||
-rw-r--r-- | libs/audioflinger/AudioHardwareStub.h | 1 | ||||
-rw-r--r-- | media/libmedia/AudioRecord.cpp | 11 | ||||
-rw-r--r-- | media/libmedia/AudioSystem.cpp | 10 | ||||
-rw-r--r-- | media/libmedia/IAudioFlinger.cpp | 19 |
12 files changed, 81 insertions, 2 deletions
diff --git a/include/media/AudioRecord.h b/include/media/AudioRecord.h index 622c596ba158..92bc126648e1 100644 --- a/include/media/AudioRecord.h +++ b/include/media/AudioRecord.h @@ -294,6 +294,13 @@ public: */ ssize_t read(void* buffer, size_t size); + /* Return the amount of input frames lost in the audio driver since the last call of this function. + * Audio driver is expected to reset the value to 0 and restart counting upon returning the current value by this function call. + * Such loss typically occurs when the user space process is blocked longer than the capacity of audio driver buffers. + * Unit: the number of input audio frames + */ + unsigned int getInputFramesLost(); + private: /* copying audio tracks is not allowed */ AudioRecord(const AudioRecord& other); @@ -348,6 +355,7 @@ private: uint32_t mUpdatePeriod; uint32_t mFlags; uint32_t mChannels; + audio_io_handle_t mInput; }; }; // namespace android diff --git a/include/media/AudioSystem.h b/include/media/AudioSystem.h index 42bb4df4177a..d0ccc5059f4f 100644 --- a/include/media/AudioSystem.h +++ b/include/media/AudioSystem.h @@ -233,6 +233,7 @@ public: // necessary to check returned status before using the returned values. static status_t getRenderPosition(uint32_t *halFrames, uint32_t *dspFrames, int stream = DEFAULT); + static unsigned int getInputFramesLost(audio_io_handle_t ioHandle); // // AudioPolicyService interface // diff --git a/include/media/IAudioFlinger.h b/include/media/IAudioFlinger.h index bddd23e3461f..c147632ff907 100644 --- a/include/media/IAudioFlinger.h +++ b/include/media/IAudioFlinger.h @@ -130,7 +130,10 @@ public: virtual status_t setStreamOutput(uint32_t stream, int output) = 0; virtual status_t setVoiceVolume(float volume) = 0; + virtual status_t getRenderPosition(uint32_t *halFrames, uint32_t *dspFrames, int output) = 0; + + virtual unsigned int getInputFramesLost(int ioHandle) = 0; }; diff --git a/libs/audioflinger/AudioDumpInterface.cpp b/libs/audioflinger/AudioDumpInterface.cpp index 30e2bc9c9b3d..a018b4c22598 100644 --- a/libs/audioflinger/AudioDumpInterface.cpp +++ b/libs/audioflinger/AudioDumpInterface.cpp @@ -509,6 +509,12 @@ String8 AudioStreamInDump::getParameters(const String8& keys) return param.toString(); } +unsigned int AudioStreamInDump::getInputFramesLost() const +{ + if (mFinalStream != 0 ) return mFinalStream->getInputFramesLost(); + return 0; +} + status_t AudioStreamInDump::dump(int fd, const Vector<String16>& args) { if (mFinalStream != 0 ) return mFinalStream->dump(fd, args); diff --git a/libs/audioflinger/AudioDumpInterface.h b/libs/audioflinger/AudioDumpInterface.h index 5b9a6b1434d8..4c62b3ed78da 100644 --- a/libs/audioflinger/AudioDumpInterface.h +++ b/libs/audioflinger/AudioDumpInterface.h @@ -94,6 +94,7 @@ public: virtual status_t standby(); virtual status_t setParameters(const String8& keyValuePairs); virtual String8 getParameters(const String8& keys); + virtual unsigned int getInputFramesLost() const; virtual status_t dump(int fd, const Vector<String16>& args); void Close(void); AudioStreamIn* finalStream() { return mFinalStream; } diff --git a/libs/audioflinger/AudioFlinger.cpp b/libs/audioflinger/AudioFlinger.cpp index 9d52882da786..2269352e5a32 100644 --- a/libs/audioflinger/AudioFlinger.cpp +++ b/libs/audioflinger/AudioFlinger.cpp @@ -618,6 +618,21 @@ size_t AudioFlinger::getInputBufferSize(uint32_t sampleRate, int format, int cha return mAudioHardware->getInputBufferSize(sampleRate, format, channelCount); } +unsigned int AudioFlinger::getInputFramesLost(int ioHandle) +{ + if (ioHandle == 0) { + return 0; + } + + Mutex::Autolock _l(mLock); + + RecordThread *recordThread = checkRecordThread_l(ioHandle); + if (recordThread != NULL) { + return recordThread->getInputFramesLost(); + } + return 0; +} + status_t AudioFlinger::setVoiceVolume(float value) { // check calling permissions @@ -3575,6 +3590,11 @@ void AudioFlinger::RecordThread::readInputParameters() mRsmpInIndex = mFrameCount; } +unsigned int AudioFlinger::RecordThread::getInputFramesLost() +{ + return mInput->getInputFramesLost(); +} + // ---------------------------------------------------------------------------- int AudioFlinger::openOutput(uint32_t *pDevices, diff --git a/libs/audioflinger/AudioFlinger.h b/libs/audioflinger/AudioFlinger.h index 44da9ed45646..739ec3331165 100644 --- a/libs/audioflinger/AudioFlinger.h +++ b/libs/audioflinger/AudioFlinger.h @@ -108,6 +108,7 @@ public: virtual void registerClient(const sp<IAudioFlingerClient>& client); virtual size_t getInputBufferSize(uint32_t sampleRate, int format, int channelCount); + virtual unsigned int getInputFramesLost(int ioHandle); virtual int openOutput(uint32_t *pDevices, uint32_t *pSamplingRate, @@ -745,6 +746,7 @@ private: virtual String8 getParameters(const String8& keys); virtual void audioConfigChanged(int event, int param = 0); void readInputParameters(); + virtual unsigned int getInputFramesLost(); private: RecordThread(); diff --git a/libs/audioflinger/AudioHardwareGeneric.h b/libs/audioflinger/AudioHardwareGeneric.h index 95c7ea37a422..aa4e78da7fd0 100644 --- a/libs/audioflinger/AudioHardwareGeneric.h +++ b/libs/audioflinger/AudioHardwareGeneric.h @@ -88,6 +88,7 @@ public: virtual status_t standby() { return NO_ERROR; } virtual status_t setParameters(const String8& keyValuePairs); virtual String8 getParameters(const String8& keys); + virtual unsigned int getInputFramesLost() const { return 0; } private: AudioHardwareGeneric *mAudioHardware; diff --git a/libs/audioflinger/AudioHardwareStub.h b/libs/audioflinger/AudioHardwareStub.h index 769ae3fbddae..06a29de90dd4 100644 --- a/libs/audioflinger/AudioHardwareStub.h +++ b/libs/audioflinger/AudioHardwareStub.h @@ -57,6 +57,7 @@ public: virtual status_t standby() { return NO_ERROR; } virtual status_t setParameters(const String8& keyValuePairs) { return NO_ERROR;} virtual String8 getParameters(const String8& keys); + virtual unsigned int getInputFramesLost() const { return 0; } }; class AudioHardwareStub : public AudioHardwareBase diff --git a/media/libmedia/AudioRecord.cpp b/media/libmedia/AudioRecord.cpp index 7bbd0b2e8e91..bce33713f6ec 100644 --- a/media/libmedia/AudioRecord.cpp +++ b/media/libmedia/AudioRecord.cpp @@ -199,6 +199,7 @@ status_t AudioRecord::set( mUpdatePeriod = 0; mInputSource = (uint8_t)inputSource; mFlags = flags; + mInput = input; return NO_ERROR; } @@ -384,6 +385,13 @@ status_t AudioRecord::getPosition(uint32_t *position) return NO_ERROR; } +unsigned int AudioRecord::getInputFramesLost() +{ + if (mActive) + return AudioSystem::getInputFramesLost(mInput); + else + return 0; +} // ------------------------------------------------------------------------- @@ -517,10 +525,11 @@ void AudioRecord::releaseBuffer(Buffer* audioBuffer) audio_io_handle_t AudioRecord::getInput() { - return AudioSystem::getInput(mInputSource, + mInput = AudioSystem::getInput(mInputSource, mCblk->sampleRate, mFormat, mChannels, (AudioSystem::audio_in_acoustics)mFlags); + return mInput; } // ------------------------------------------------------------------------- diff --git a/media/libmedia/AudioSystem.cpp b/media/libmedia/AudioSystem.cpp index 3f9c6d6b4e02..4b364f2da0a6 100644 --- a/media/libmedia/AudioSystem.cpp +++ b/media/libmedia/AudioSystem.cpp @@ -354,6 +354,16 @@ status_t AudioSystem::getRenderPosition(uint32_t *halFrames, uint32_t *dspFrames return af->getRenderPosition(halFrames, dspFrames, getOutput((stream_type)stream)); } +unsigned int AudioSystem::getInputFramesLost(audio_io_handle_t ioHandle) { + const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); + unsigned int result = 0; + if (af == 0) return result; + if (ioHandle == NULL) return result; + + result = af->getInputFramesLost(ioHandle); + return result; +} + // --------------------------------------------------------------------------- void AudioSystem::AudioFlingerClient::binderDied(const wp<IBinder>& who) { diff --git a/media/libmedia/IAudioFlinger.cpp b/media/libmedia/IAudioFlinger.cpp index ca3a2a600f8f..47bcc12422ea 100644 --- a/media/libmedia/IAudioFlinger.cpp +++ b/media/libmedia/IAudioFlinger.cpp @@ -61,7 +61,8 @@ enum { CLOSE_INPUT, SET_STREAM_OUTPUT, SET_VOICE_VOLUME, - GET_RENDER_POSITION + GET_RENDER_POSITION, + GET_INPUT_FRAMES_LOST }; class BpAudioFlinger : public BpInterface<IAudioFlinger> @@ -487,6 +488,15 @@ public: } return status; } + + virtual unsigned int getInputFramesLost(int ioHandle) + { + Parcel data, reply; + data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); + data.writeInt32(ioHandle); + remote()->transact(GET_INPUT_FRAMES_LOST, data, &reply); + return reply.readInt32(); + } }; IMPLEMENT_META_INTERFACE(AudioFlinger, "android.media.IAudioFlinger"); @@ -752,6 +762,13 @@ status_t BnAudioFlinger::onTransact( } return NO_ERROR; } + case GET_INPUT_FRAMES_LOST: { + CHECK_INTERFACE(IAudioFlinger, data, reply); + int ioHandle = data.readInt32(); + reply->writeInt32(getInputFramesLost(ioHandle)); + return NO_ERROR; + } break; + default: return BBinder::onTransact(code, data, reply, flags); } |