diff options
author | Patrik Ryd <patrik.ryd@linaro.org> | 2012-05-16 16:38:42 +0200 |
---|---|---|
committer | Patrik Ryd <patrik.ryd@linaro.org> | 2012-05-16 16:38:42 +0200 |
commit | 77e3d81262855702023f7fa4a7a63bf6abf784b0 (patch) | |
tree | d1e7a6046a307e82d4ef4eafda58e53da4b7fcd6 | |
parent | 4731047ff0e46763a3d54ee83326a230a1a387df (diff) | |
download | base-77e3d81262855702023f7fa4a7a63bf6abf784b0.tar.gz |
Revert "Adapt the audio output latency to Android 4.0.4"
This reverts commit 4731047ff0e46763a3d54ee83326a230a1a387df.
-rw-r--r-- | include/media/AudioParameter.h | 2 | ||||
-rw-r--r-- | include/media/AudioSystem.h | 11 | ||||
-rw-r--r-- | include/media/AudioTrack.h | 7 | ||||
-rw-r--r-- | include/media/stagefright/AudioPlayer.h | 1 | ||||
-rw-r--r-- | media/libmedia/AudioParameter.cpp | 2 | ||||
-rw-r--r-- | media/libmedia/AudioSystem.cpp | 17 | ||||
-rw-r--r-- | media/libmedia/AudioTrack.cpp | 34 | ||||
-rw-r--r-- | media/libmediaplayerservice/MediaPlayerService.cpp | 6 | ||||
-rw-r--r-- | media/libmediaplayerservice/MediaPlayerService.h | 1 | ||||
-rw-r--r-- | media/libstagefright/AudioPlayer.cpp | 16 | ||||
-rw-r--r-- | services/audioflinger/AudioFlinger.cpp | 9 |
11 files changed, 49 insertions, 57 deletions
diff --git a/include/media/AudioParameter.h b/include/media/AudioParameter.h index bf8c1aeaee36..86b0e13dd2cf 100644 --- a/include/media/AudioParameter.h +++ b/include/media/AudioParameter.h @@ -46,7 +46,7 @@ public: static const char *keyChannels; static const char *keyFrameCount; static const char *keyInputSource; - static const char *keySinkLatency; + static const char *keyLatency; String8 toString(); diff --git a/include/media/AudioSystem.h b/include/media/AudioSystem.h index 6d6cf55e7b36..2072dced5cac 100644 --- a/include/media/AudioSystem.h +++ b/include/media/AudioSystem.h @@ -30,8 +30,7 @@ namespace android { typedef void (*audio_error_callback)(status_t err); -typedef void (*latency_update_callback)(void *cookie, audio_io_handle_t output, uint32_t sinkLatency); - +typedef void (*latency_update_callback)(void *cookie, audio_io_handle_t output, uint32_t latency); class IAudioPolicyService; class String8; @@ -111,8 +110,7 @@ public: static int newAudioSessionId(); static void acquireAudioSessionId(int audioSession); static void releaseAudioSessionId(int audioSession); - - static int registerLatencyNotificationClient(latency_update_callback cb, void *cookie, audio_io_handle_t output); + static int registerLatencyNotificationClient(latency_update_callback cb, void *cookie); static void unregisterLatencyNotificationClient(int clientId); // types of io configuration change events received with ioConfigChanged() @@ -124,7 +122,6 @@ public: INPUT_CLOSED, INPUT_CONFIG_CHANGED, STREAM_CONFIG_CHANGED, - SINK_LATENCY_CHANGED, NUM_CONFIG_EVENTS }; @@ -229,8 +226,7 @@ private: struct NotificationClient : public RefBase { latency_update_callback mCb; - void *mCookie; - audio_io_handle_t mOutput; + void * mCookie; }; static sp<AudioFlingerClient> gAudioFlingerClient; @@ -255,7 +251,6 @@ private: // list of output descriptors containing cached parameters // (sampling rate, framecount, channel count...) static DefaultKeyedVector<audio_io_handle_t, OutputDescriptor *> gOutputs; - static Mutex gLatencyLock; static int gNextUniqueLatencyId; static DefaultKeyedVector<int, sp<AudioSystem::NotificationClient> > gLatencyNotificationClients; diff --git a/include/media/AudioTrack.h b/include/media/AudioTrack.h index 6fb42197f8e9..eaea86c91aaa 100644 --- a/include/media/AudioTrack.h +++ b/include/media/AudioTrack.h @@ -56,7 +56,7 @@ public: EVENT_MARKER = 3, // Playback head is at the specified marker position (See setMarkerPosition()). EVENT_NEW_POS = 4, // Playback head is at a new position (See setPositionUpdatePeriod()). EVENT_BUFFER_END = 5, // Playback head is at the end of the buffer. - EVENT_LATENCY_CHANGED = 6 // Audio sink latency has changed. + EVENT_LATENCY_CHANGED = 6 // Audio output has been reconfigured and latency has changed. }; /* Create Buffer on the stack and pass it to obtainBuffer() @@ -452,9 +452,8 @@ private: status_t setLoop_l(uint32_t loopStart, uint32_t loopEnd, int loopCount); audio_io_handle_t getOutput_l(); status_t restoreTrack_l(audio_track_cblk_t*& cblk, bool fromStart); - - static void LatencyCallback(void *cookie, audio_io_handle_t output, - uint32_t sinkLatency); + static void LatencyCallbackWrapper(void *cookie, audio_io_handle_t output, uint32_t latency); + void latencyCallback(audio_io_handle_t output, uint32_t latency); sp<IAudioTrack> mAudioTrack; sp<IMemory> mCblkMemory; diff --git a/include/media/stagefright/AudioPlayer.h b/include/media/stagefright/AudioPlayer.h index 0fdb2971cfe8..c878bee9883c 100644 --- a/include/media/stagefright/AudioPlayer.h +++ b/include/media/stagefright/AudioPlayer.h @@ -101,7 +101,6 @@ private: static size_t AudioSinkCallback( MediaPlayerBase::AudioSink *audioSink, void *data, size_t size, void *me); - static void LatencyCallback(uint32_t latency, void *cookie); size_t fillBuffer(void *data, size_t size); diff --git a/media/libmedia/AudioParameter.cpp b/media/libmedia/AudioParameter.cpp index 49f6e2ab18d1..8d6b71be28f4 100644 --- a/media/libmedia/AudioParameter.cpp +++ b/media/libmedia/AudioParameter.cpp @@ -29,7 +29,7 @@ const char *AudioParameter::keyFormat = "format"; const char *AudioParameter::keyChannels = "channels"; const char *AudioParameter::keyFrameCount = "frame_count"; const char *AudioParameter::keyInputSource = "input_source"; -const char *AudioParameter::keySinkLatency = "sink_latency"; +const char *AudioParameter::keyLatency = "latency"; AudioParameter::AudioParameter(const String8& keyValuePairs) { diff --git a/media/libmedia/AudioSystem.cpp b/media/libmedia/AudioSystem.cpp index 7e83b819e951..e300af24f412 100644 --- a/media/libmedia/AudioSystem.cpp +++ b/media/libmedia/AudioSystem.cpp @@ -374,14 +374,12 @@ void AudioSystem::releaseAudioSessionId(int audioSession) { } } -int AudioSystem::registerLatencyNotificationClient(latency_update_callback cb, - void *cookie, audio_io_handle_t output) { +int AudioSystem::registerLatencyNotificationClient(latency_update_callback cb, void *cookie) { Mutex::Autolock _l(gLatencyLock); sp<NotificationClient> notificationClient = new NotificationClient(); notificationClient->mCb = cb; notificationClient->mCookie = cookie; - notificationClient->mOutput = output; gNextUniqueLatencyId++; gLatencyNotificationClients.add(gNextUniqueLatencyId, notificationClient); @@ -392,7 +390,6 @@ void AudioSystem::unregisterLatencyNotificationClient(int clientId) { Mutex::Autolock _l(gLatencyLock); gLatencyNotificationClients.removeItem(clientId); } - // --------------------------------------------------------------------------- void AudioSystem::AudioFlingerClient::binderDied(const wp<IBinder>& who) { @@ -472,20 +469,20 @@ void AudioSystem::AudioFlingerClient::ioConfigChanged(int event, int ioHandle, v ioHandle, desc->samplingRate, desc->format, desc->channels, desc->frameCount, desc->latency); OutputDescriptor *outputDesc = gOutputs.valueAt(index); + uint32_t oldLatency = outputDesc->latency; delete outputDesc; outputDesc = new OutputDescriptor(*desc); gOutputs.replaceValueFor(ioHandle, outputDesc); - } break; - case SINK_LATENCY_CHANGED: { - int sinkLatency = *((int*)param2); + if (oldLatency == outputDesc->latency) { + break; + } + uint32_t newLatency = outputDesc->latency; gLock.unlock(); gLatencyLock.lock(); size_t size = gLatencyNotificationClients.size(); for (size_t i = 0; i < size; i++) { sp<NotificationClient> client = gLatencyNotificationClients.valueAt(i); - if (client->mOutput == ioHandle) { - (*client->mCb)(client->mCookie, ioHandle, sinkLatency); - } + (*client->mCb)(client->mCookie, ioHandle, newLatency); } gLatencyLock.unlock(); gLock.lock(); diff --git a/media/libmedia/AudioTrack.cpp b/media/libmedia/AudioTrack.cpp index 329542b22627..2f7b011a2d6c 100644 --- a/media/libmedia/AudioTrack.cpp +++ b/media/libmedia/AudioTrack.cpp @@ -124,8 +124,6 @@ AudioTrack::~AudioTrack() LOGV_IF(mSharedBuffer != 0, "Destructor sharedBuffer: %p", mSharedBuffer->pointer()); if (mStatus == NO_ERROR) { - AudioSystem::unregisterLatencyNotificationClient(mLatencyClientId); - // Make sure that callback function exits in the case where // it is looping on buffer full condition in obtainBuffer(). // Otherwise the callback thread will never exit. @@ -138,6 +136,7 @@ AudioTrack::~AudioTrack() IPCThreadState::self()->flushCommands(); AudioSystem::releaseAudioSessionId(mSessionId); } + AudioSystem::unregisterLatencyNotificationClient(mLatencyClientId); } status_t AudioTrack::set( @@ -265,6 +264,8 @@ status_t AudioTrack::set( mFlags = flags; AudioSystem::acquireAudioSessionId(mSessionId); mRestoreStatus = NO_ERROR; + mLatencyClientId = AudioSystem::registerLatencyNotificationClient( + &AudioTrack::LatencyCallbackWrapper, this); return NO_ERROR; } @@ -822,13 +823,6 @@ status_t AudioTrack::createTrack_l( mCblk->waitTimeMs = 0; mRemainingFrames = mNotificationFramesAct; mLatency = afLatency + (1000*mCblk->frameCount) / sampleRate; - - if (mLatencyClientId != -1) { - AudioSystem::unregisterLatencyNotificationClient(mLatencyClientId); - } - mLatencyClientId = AudioSystem::registerLatencyNotificationClient( - &AudioTrack::LatencyCallback, this, output); - return NO_ERROR; } @@ -1288,12 +1282,24 @@ status_t AudioTrack::dump(int fd, const Vector<String16>& args) const } // static -void AudioTrack::LatencyCallback(void *cookie, audio_io_handle_t output, uint32_t sinkLatency) +void AudioTrack::LatencyCallbackWrapper(void *cookie, audio_io_handle_t output, uint32_t latency) { - AudioTrack *me = static_cast<AudioTrack *>(cookie); - uint32_t syncLatency = me->mLatency + sinkLatency; - if (me->mCbf != NULL) { - me->mCbf(EVENT_LATENCY_CHANGED, me->mUserData, &syncLatency); + static_cast<AudioTrack *>(cookie)->latencyCallback(output, latency); +} + +void AudioTrack::latencyCallback(audio_io_handle_t output, uint32_t latency) +{ + audio_io_handle_t myOutput = getOutput(); + if (output != myOutput) { + return; + } + + uint32_t oldLatency = mLatency; + mLatency = latency + (1000*mCblk->frameCount) / mCblk->sampleRate; + LOGV("new latency for output %d (old latency %d, new latency %d)", output, oldLatency, mLatency); + + if (mCbf != NULL) { + mCbf(EVENT_LATENCY_CHANGED, mUserData, &mLatency); } } diff --git a/media/libmediaplayerservice/MediaPlayerService.cpp b/media/libmediaplayerservice/MediaPlayerService.cpp index 1b78c23d1571..72bb1bcb3ccb 100644 --- a/media/libmediaplayerservice/MediaPlayerService.cpp +++ b/media/libmediaplayerservice/MediaPlayerService.cpp @@ -1515,12 +1515,12 @@ void MediaPlayerService::AudioOutput::CallbackWrapper( } else if (event == AudioTrack::EVENT_LATENCY_CHANGED) { AudioOutput *me = (AudioOutput *)cookie; - uint32_t *syncLatency = (uint32_t *)info; + uint32_t *newLatency = (uint32_t *)info; + me->mLatency = *newLatency; if (me->mLatencyCallback != NULL) { - (*me->mLatencyCallback)(*syncLatency, me->mCallbackCookie); + (*me->mLatencyCallback)(*newLatency, me->mCallbackCookie); } } - } int MediaPlayerService::AudioOutput::getSessionId() diff --git a/media/libmediaplayerservice/MediaPlayerService.h b/media/libmediaplayerservice/MediaPlayerService.h index 095707054abc..95176f512940 100644 --- a/media/libmediaplayerservice/MediaPlayerService.h +++ b/media/libmediaplayerservice/MediaPlayerService.h @@ -86,7 +86,6 @@ class MediaPlayerService : public BnMediaPlayerService int format, int bufferCount, AudioCallback cb, void *cookie, LatencyCallback latencyCb = NULL); - virtual void start(); virtual ssize_t write(const void* buffer, size_t size); virtual void stop(); diff --git a/media/libstagefright/AudioPlayer.cpp b/media/libstagefright/AudioPlayer.cpp index 796d1b151da2..79210e4de8fa 100644 --- a/media/libstagefright/AudioPlayer.cpp +++ b/media/libstagefright/AudioPlayer.cpp @@ -261,10 +261,7 @@ void AudioPlayer::LatencyCallback(uint32_t latency, void *cookie) { AudioPlayer *me = (AudioPlayer *)cookie; int64_t oldLatency = me->mLatencyUs; me->mLatencyUs = (int64_t)latency * 1000; - if (oldLatency != me->mLatencyUs) { - LOGI("Audio output latency updated from %lldus to %lldus", - oldLatency, me->mLatencyUs); - } + LOGI("Audio output latency updated from %lldus to %lldus", oldLatency, me->mLatencyUs); } bool AudioPlayer::isSeeking() { @@ -291,18 +288,15 @@ size_t AudioPlayer::AudioSinkCallback( void AudioPlayer::AudioCallback(int event, void *info) { if (event == AudioTrack::EVENT_MORE_DATA) { - AudioTrack::Buffer *buffer = (AudioTrack::Buffer *)info; - size_t numBytesWritten = fillBuffer(buffer->raw, buffer->size); + AudioTrack::Buffer *buffer = (AudioTrack::Buffer *)info; + size_t numBytesWritten = fillBuffer(buffer->raw, buffer->size); - buffer->size = numBytesWritten; + buffer->size = numBytesWritten; } else if (event == AudioTrack::EVENT_LATENCY_CHANGED) { uint32_t *newLatency = (uint32_t *)info; int64_t oldLatency = mLatencyUs; mLatencyUs = (int64_t)*newLatency * 1000; - if (oldLatency != mLatencyUs) { - LOGI("Audio output latency updated from %lldus to %lldus", - oldLatency, mLatencyUs); - } + LOGI("Audio output latency updated from %lldus to %lldus", oldLatency, mLatencyUs); } } diff --git a/services/audioflinger/AudioFlinger.cpp b/services/audioflinger/AudioFlinger.cpp index eff6ad687727..7edf2b2c719f 100644 --- a/services/audioflinger/AudioFlinger.cpp +++ b/services/audioflinger/AudioFlinger.cpp @@ -1712,7 +1712,6 @@ void AudioFlinger::PlaybackThread::audioConfigChanged_l(int event, int param) { break; case AudioSystem::STREAM_CONFIG_CHANGED: - case AudioSystem::SINK_LATENCY_CHANGED: param2 = ¶m; case AudioSystem::OUTPUT_CLOSED: default: @@ -2348,6 +2347,7 @@ void AudioFlinger::MixerThread::deleteTrackName_l(int name) bool AudioFlinger::MixerThread::checkForNewParameters_l() { bool reconfig = false; + bool updateLatency = false; while (!mNewParameters.isEmpty()) { status_t status = NO_ERROR; @@ -2411,8 +2411,8 @@ bool AudioFlinger::MixerThread::checkForNewParameters_l() mEffectChains[i]->setDevice_l(mDevice); } } - if (param.getInt(String8(AudioParameter::keySinkLatency), value) == NO_ERROR) { - sendConfigEvent_l(AudioSystem::SINK_LATENCY_CHANGED, value); + if (param.getInt(String8(AudioParameter::keyLatency), value) == NO_ERROR) { + updateLatency = true; } if (status == NO_ERROR) { @@ -2440,6 +2440,9 @@ bool AudioFlinger::MixerThread::checkForNewParameters_l() } sendConfigEvent_l(AudioSystem::OUTPUT_CONFIG_CHANGED); } + if (status == NO_ERROR && updateLatency) { + sendConfigEvent_l(AudioSystem::OUTPUT_CONFIG_CHANGED); + } } mNewParameters.removeAt(0); |