diff options
-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-- | media/libmedia/AudioRecord.cpp | 11 | ||||
-rw-r--r-- | media/libmedia/AudioSystem.cpp | 10 | ||||
-rw-r--r-- | media/libmedia/IAudioFlinger.cpp | 19 |
6 files changed, 50 insertions, 2 deletions
diff --git a/include/media/AudioRecord.h b/include/media/AudioRecord.h index 622c596..92bc126 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 42bb4df..d0ccc50 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 bddd23e..c147632 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/media/libmedia/AudioRecord.cpp b/media/libmedia/AudioRecord.cpp index 7bbd0b2..bce3371 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 3f9c6d6..4b364f2 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 ca3a2a6..47bcc12 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); } |