Loading include/media/AudioSystem.h +3 −0 Original line number Diff line number Diff line Loading @@ -158,6 +158,9 @@ public: // or no HW sync source is used. static audio_hw_sync_t getAudioHwSyncForSession(audio_session_t sessionId); // Indicate JAVA services are ready (scheduling, power management ...) static status_t systemReady(); // Events used to synchronize actions between audio sessions. // For instance SYNC_EVENT_PRESENTATION_COMPLETE can be used to delay recording start until // playback is complete on another audio session. Loading include/media/IAudioFlinger.h +3 −0 Original line number Diff line number Diff line Loading @@ -243,6 +243,9 @@ public: /* Get the HW synchronization source used for an audio session */ virtual audio_hw_sync_t getAudioHwSyncForSession(audio_session_t sessionId) = 0; /* Indicate JAVA services are ready (scheduling, power management ...) */ virtual status_t systemReady() = 0; }; Loading media/libmedia/AudioSystem.cpp +7 −0 Original line number Diff line number Diff line Loading @@ -423,6 +423,13 @@ audio_hw_sync_t AudioSystem::getAudioHwSyncForSession(audio_session_t sessionId) return af->getAudioHwSyncForSession(sessionId); } status_t AudioSystem::systemReady() { const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); if (af == 0) return NO_INIT; return af->systemReady(); } // --------------------------------------------------------------------------- Loading media/libmedia/IAudioFlinger.cpp +13 −1 Original line number Diff line number Diff line Loading @@ -80,7 +80,8 @@ enum { RELEASE_AUDIO_PATCH, LIST_AUDIO_PATCHES, SET_AUDIO_PORT_CONFIG, GET_AUDIO_HW_SYNC GET_AUDIO_HW_SYNC, SYSTEM_READY }; #define MAX_ITEMS_PER_LIST 1024 Loading Loading @@ -903,6 +904,12 @@ public: } return (audio_hw_sync_t)reply.readInt32(); } virtual status_t systemReady() { Parcel data, reply; data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); return remote()->transact(SYSTEM_READY, data, &reply, IBinder::FLAG_ONEWAY); } }; IMPLEMENT_META_INTERFACE(AudioFlinger, "android.media.IAudioFlinger"); Loading Loading @@ -1396,6 +1403,11 @@ status_t BnAudioFlinger::onTransact( reply->writeInt32(getAudioHwSyncForSession((audio_session_t)data.readInt32())); return NO_ERROR; } break; case SYSTEM_READY: { CHECK_INTERFACE(IAudioFlinger, data, reply); systemReady(); return NO_ERROR; } break; default: return BBinder::onTransact(code, data, reply, flags); } Loading services/audioflinger/AudioFlinger.cpp +28 −6 Original line number Diff line number Diff line Loading @@ -181,7 +181,8 @@ AudioFlinger::AudioFlinger() mIsLowRamDevice(true), mIsDeviceTypeKnown(false), mGlobalEffectEnableTime(0), mPrimaryOutputSampleRate(0) mPrimaryOutputSampleRate(0), mSystemReady(false) { getpid_cached = getpid(); char value[PROPERTY_VALUE_MAX]; Loading Loading @@ -1722,6 +1723,26 @@ audio_hw_sync_t AudioFlinger::getAudioHwSyncForSession(audio_session_t sessionId return (audio_hw_sync_t)value; } status_t AudioFlinger::systemReady() { Mutex::Autolock _l(mLock); ALOGI("%s", __FUNCTION__); if (mSystemReady) { ALOGW("%s called twice", __FUNCTION__); return NO_ERROR; } mSystemReady = true; for (size_t i = 0; i < mPlaybackThreads.size(); i++) { ThreadBase *thread = (ThreadBase *)mPlaybackThreads.valueAt(i).get(); thread->systemReady(); } for (size_t i = 0; i < mRecordThreads.size(); i++) { ThreadBase *thread = (ThreadBase *)mRecordThreads.valueAt(i).get(); thread->systemReady(); } return NO_ERROR; } // setAudioHwSyncForSession_l() must be called with AudioFlinger::mLock held void AudioFlinger::setAudioHwSyncForSession_l(PlaybackThread *thread, audio_session_t sessionId) { Loading Loading @@ -1794,15 +1815,15 @@ sp<AudioFlinger::PlaybackThread> AudioFlinger::openOutput_l(audio_module_handle_ PlaybackThread *thread; if (flags & AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD) { thread = new OffloadThread(this, outputStream, *output, devices); thread = new OffloadThread(this, outputStream, *output, devices, mSystemReady); ALOGV("openOutput_l() created offload output: ID %d thread %p", *output, thread); } else if ((flags & AUDIO_OUTPUT_FLAG_DIRECT) || !isValidPcmSinkFormat(config->format) || !isValidPcmSinkChannelMask(config->channel_mask)) { thread = new DirectOutputThread(this, outputStream, *output, devices); thread = new DirectOutputThread(this, outputStream, *output, devices, mSystemReady); ALOGV("openOutput_l() created direct output: ID %d thread %p", *output, thread); } else { thread = new MixerThread(this, outputStream, *output, devices); thread = new MixerThread(this, outputStream, *output, devices, mSystemReady); ALOGV("openOutput_l() created mixer output: ID %d thread %p", *output, thread); } mPlaybackThreads.add(*output, thread); Loading Loading @@ -1873,7 +1894,7 @@ audio_io_handle_t AudioFlinger::openDuplicateOutput(audio_io_handle_t output1, } audio_io_handle_t id = nextUniqueId(); DuplicatingThread *thread = new DuplicatingThread(this, thread1, id); DuplicatingThread *thread = new DuplicatingThread(this, thread1, id, mSystemReady); thread->addOutputTrack(thread2); mPlaybackThreads.add(id, thread); // notify client processes of the new output creation Loading Loading @@ -2120,7 +2141,8 @@ sp<AudioFlinger::RecordThread> AudioFlinger::openInput_l(audio_module_handle_t m inputStream, *input, primaryOutputDevice_l(), devices devices, mSystemReady #ifdef TEE_SINK , teeSink #endif Loading Loading
include/media/AudioSystem.h +3 −0 Original line number Diff line number Diff line Loading @@ -158,6 +158,9 @@ public: // or no HW sync source is used. static audio_hw_sync_t getAudioHwSyncForSession(audio_session_t sessionId); // Indicate JAVA services are ready (scheduling, power management ...) static status_t systemReady(); // Events used to synchronize actions between audio sessions. // For instance SYNC_EVENT_PRESENTATION_COMPLETE can be used to delay recording start until // playback is complete on another audio session. Loading
include/media/IAudioFlinger.h +3 −0 Original line number Diff line number Diff line Loading @@ -243,6 +243,9 @@ public: /* Get the HW synchronization source used for an audio session */ virtual audio_hw_sync_t getAudioHwSyncForSession(audio_session_t sessionId) = 0; /* Indicate JAVA services are ready (scheduling, power management ...) */ virtual status_t systemReady() = 0; }; Loading
media/libmedia/AudioSystem.cpp +7 −0 Original line number Diff line number Diff line Loading @@ -423,6 +423,13 @@ audio_hw_sync_t AudioSystem::getAudioHwSyncForSession(audio_session_t sessionId) return af->getAudioHwSyncForSession(sessionId); } status_t AudioSystem::systemReady() { const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); if (af == 0) return NO_INIT; return af->systemReady(); } // --------------------------------------------------------------------------- Loading
media/libmedia/IAudioFlinger.cpp +13 −1 Original line number Diff line number Diff line Loading @@ -80,7 +80,8 @@ enum { RELEASE_AUDIO_PATCH, LIST_AUDIO_PATCHES, SET_AUDIO_PORT_CONFIG, GET_AUDIO_HW_SYNC GET_AUDIO_HW_SYNC, SYSTEM_READY }; #define MAX_ITEMS_PER_LIST 1024 Loading Loading @@ -903,6 +904,12 @@ public: } return (audio_hw_sync_t)reply.readInt32(); } virtual status_t systemReady() { Parcel data, reply; data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); return remote()->transact(SYSTEM_READY, data, &reply, IBinder::FLAG_ONEWAY); } }; IMPLEMENT_META_INTERFACE(AudioFlinger, "android.media.IAudioFlinger"); Loading Loading @@ -1396,6 +1403,11 @@ status_t BnAudioFlinger::onTransact( reply->writeInt32(getAudioHwSyncForSession((audio_session_t)data.readInt32())); return NO_ERROR; } break; case SYSTEM_READY: { CHECK_INTERFACE(IAudioFlinger, data, reply); systemReady(); return NO_ERROR; } break; default: return BBinder::onTransact(code, data, reply, flags); } Loading
services/audioflinger/AudioFlinger.cpp +28 −6 Original line number Diff line number Diff line Loading @@ -181,7 +181,8 @@ AudioFlinger::AudioFlinger() mIsLowRamDevice(true), mIsDeviceTypeKnown(false), mGlobalEffectEnableTime(0), mPrimaryOutputSampleRate(0) mPrimaryOutputSampleRate(0), mSystemReady(false) { getpid_cached = getpid(); char value[PROPERTY_VALUE_MAX]; Loading Loading @@ -1722,6 +1723,26 @@ audio_hw_sync_t AudioFlinger::getAudioHwSyncForSession(audio_session_t sessionId return (audio_hw_sync_t)value; } status_t AudioFlinger::systemReady() { Mutex::Autolock _l(mLock); ALOGI("%s", __FUNCTION__); if (mSystemReady) { ALOGW("%s called twice", __FUNCTION__); return NO_ERROR; } mSystemReady = true; for (size_t i = 0; i < mPlaybackThreads.size(); i++) { ThreadBase *thread = (ThreadBase *)mPlaybackThreads.valueAt(i).get(); thread->systemReady(); } for (size_t i = 0; i < mRecordThreads.size(); i++) { ThreadBase *thread = (ThreadBase *)mRecordThreads.valueAt(i).get(); thread->systemReady(); } return NO_ERROR; } // setAudioHwSyncForSession_l() must be called with AudioFlinger::mLock held void AudioFlinger::setAudioHwSyncForSession_l(PlaybackThread *thread, audio_session_t sessionId) { Loading Loading @@ -1794,15 +1815,15 @@ sp<AudioFlinger::PlaybackThread> AudioFlinger::openOutput_l(audio_module_handle_ PlaybackThread *thread; if (flags & AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD) { thread = new OffloadThread(this, outputStream, *output, devices); thread = new OffloadThread(this, outputStream, *output, devices, mSystemReady); ALOGV("openOutput_l() created offload output: ID %d thread %p", *output, thread); } else if ((flags & AUDIO_OUTPUT_FLAG_DIRECT) || !isValidPcmSinkFormat(config->format) || !isValidPcmSinkChannelMask(config->channel_mask)) { thread = new DirectOutputThread(this, outputStream, *output, devices); thread = new DirectOutputThread(this, outputStream, *output, devices, mSystemReady); ALOGV("openOutput_l() created direct output: ID %d thread %p", *output, thread); } else { thread = new MixerThread(this, outputStream, *output, devices); thread = new MixerThread(this, outputStream, *output, devices, mSystemReady); ALOGV("openOutput_l() created mixer output: ID %d thread %p", *output, thread); } mPlaybackThreads.add(*output, thread); Loading Loading @@ -1873,7 +1894,7 @@ audio_io_handle_t AudioFlinger::openDuplicateOutput(audio_io_handle_t output1, } audio_io_handle_t id = nextUniqueId(); DuplicatingThread *thread = new DuplicatingThread(this, thread1, id); DuplicatingThread *thread = new DuplicatingThread(this, thread1, id, mSystemReady); thread->addOutputTrack(thread2); mPlaybackThreads.add(id, thread); // notify client processes of the new output creation Loading Loading @@ -2120,7 +2141,8 @@ sp<AudioFlinger::RecordThread> AudioFlinger::openInput_l(audio_module_handle_t m inputStream, *input, primaryOutputDevice_l(), devices devices, mSystemReady #ifdef TEE_SINK , teeSink #endif Loading