Loading services/audioflinger/PatchPanel.cpp +18 −13 Original line number Original line Diff line number Diff line Loading @@ -152,7 +152,8 @@ status_t AudioFlinger::PatchPanel::createAudioPatch(const struct audio_patch *pa return BAD_VALUE; return BAD_VALUE; } } if (patch->num_sources == 0 || patch->num_sources > AUDIO_PATCH_PORTS_MAX || if (patch->num_sources == 0 || patch->num_sources > AUDIO_PATCH_PORTS_MAX || patch->num_sinks == 0 || patch->num_sinks > AUDIO_PATCH_PORTS_MAX) { (patch->num_sinks == 0 && patch->num_sources != 2) || patch->num_sinks > AUDIO_PATCH_PORTS_MAX) { return BAD_VALUE; return BAD_VALUE; } } // limit number of sources to 1 for now or 2 sources for special cross hw module case. // limit number of sources to 1 for now or 2 sources for special cross hw module case. Loading Loading @@ -203,18 +204,18 @@ status_t AudioFlinger::PatchPanel::createAudioPatch(const struct audio_patch *pa } } // manage patches requiring a software bridge // manage patches requiring a software bridge // - special patch request with 2 sources (reuse one existing output mix) OR // - Device to device AND // - Device to device AND // - source HW module != destination HW module OR // - source HW module != destination HW module OR // - audio HAL version < 3.0 // - audio HAL version < 3.0 // - special patch request with 2 sources (reuse one existing output mix) if ((patch->num_sources == 2) || if ((patch->sinks[0].type == AUDIO_PORT_TYPE_DEVICE) && ((patch->sinks[0].type == AUDIO_PORT_TYPE_DEVICE) && ((patch->sinks[0].ext.device.hw_module != srcModule) || ((patch->sinks[0].ext.device.hw_module != srcModule) || (audioHwDevice->version() < AUDIO_DEVICE_API_VERSION_3_0) || (audioHwDevice->version() < AUDIO_DEVICE_API_VERSION_3_0)))) { (patch->num_sources == 2))) { if (patch->num_sources == 2) { if (patch->num_sources == 2) { if (patch->sources[1].type != AUDIO_PORT_TYPE_MIX || if (patch->sources[1].type != AUDIO_PORT_TYPE_MIX || patch->sinks[0].ext.device.hw_module != (patch->num_sinks != 0 && patch->sinks[0].ext.device.hw_module != patch->sources[1].ext.mix.hw_module) { patch->sources[1].ext.mix.hw_module)) { ALOGW("createAudioPatch() invalid source combination"); ALOGW("createAudioPatch() invalid source combination"); status = INVALID_OPERATION; status = INVALID_OPERATION; goto exit; goto exit; Loading Loading @@ -379,6 +380,7 @@ status_t AudioFlinger::PatchPanel::createPatchConnections(Patch *patch, } } // create patch from playback thread output to sink device // create patch from playback thread output to sink device if (audioPatch->num_sinks != 0) { patch->mPlaybackThread->getAudioPortConfig(&subPatch.sources[0]); patch->mPlaybackThread->getAudioPortConfig(&subPatch.sources[0]); subPatch.sinks[0] = audioPatch->sinks[0]; subPatch.sinks[0] = audioPatch->sinks[0]; status = createAudioPatch(&subPatch, &patch->mPlaybackPatchHandle); status = createAudioPatch(&subPatch, &patch->mPlaybackPatchHandle); Loading @@ -386,6 +388,9 @@ status_t AudioFlinger::PatchPanel::createPatchConnections(Patch *patch, patch->mPlaybackPatchHandle = AUDIO_PATCH_HANDLE_NONE; patch->mPlaybackPatchHandle = AUDIO_PATCH_HANDLE_NONE; return status; return status; } } } else { patch->mPlaybackPatchHandle = AUDIO_PATCH_HANDLE_NONE; } // use a pseudo LCM between input and output framecount // use a pseudo LCM between input and output framecount size_t playbackFrameCount = patch->mPlaybackThread->frameCount(); size_t playbackFrameCount = patch->mPlaybackThread->frameCount(); Loading services/audioflinger/Threads.cpp +1 −1 Original line number Original line Diff line number Diff line Loading @@ -2548,7 +2548,7 @@ void AudioFlinger::PlaybackThread::invalidateTracks(audio_stream_type_t streamTy size_t size = mTracks.size(); size_t size = mTracks.size(); for (size_t i = 0; i < size; i++) { for (size_t i = 0; i < size; i++) { sp<Track> t = mTracks[i]; sp<Track> t = mTracks[i]; if (t->streamType() == streamType) { if (t->streamType() == streamType && t->isExternalTrack()) { t->invalidate(); t->invalidate(); } } } } Loading services/audiopolicy/AudioPolicyInterface.h +2 −1 Original line number Original line Diff line number Diff line Loading @@ -225,7 +225,8 @@ public: virtual status_t startAudioSource(const struct audio_port_config *source, virtual status_t startAudioSource(const struct audio_port_config *source, const audio_attributes_t *attributes, const audio_attributes_t *attributes, audio_io_handle_t *handle) = 0; audio_io_handle_t *handle, uid_t uid) = 0; virtual status_t stopAudioSource(audio_io_handle_t handle) = 0; virtual status_t stopAudioSource(audio_io_handle_t handle) = 0; }; }; Loading services/audiopolicy/common/managerdefinitions/Android.mk +1 −0 Original line number Original line Diff line number Diff line Loading @@ -17,6 +17,7 @@ LOCAL_SRC_FILES:= \ src/ConfigParsingUtils.cpp \ src/ConfigParsingUtils.cpp \ src/SoundTriggerSession.cpp \ src/SoundTriggerSession.cpp \ src/SessionRoute.cpp \ src/SessionRoute.cpp \ src/AudioSourceDescriptor.cpp LOCAL_SHARED_LIBRARIES := \ LOCAL_SHARED_LIBRARIES := \ libcutils \ libcutils \ Loading services/audiopolicy/common/managerdefinitions/include/AudioOutputDescriptor.h +42 −0 Original line number Original line Diff line number Diff line Loading @@ -22,12 +22,14 @@ #include <utils/Timers.h> #include <utils/Timers.h> #include <utils/KeyedVector.h> #include <utils/KeyedVector.h> #include <system/audio.h> #include <system/audio.h> #include "AudioSourceDescriptor.h" namespace android { namespace android { class IOProfile; class IOProfile; class AudioMix; class AudioMix; class AudioPolicyClientInterface; class AudioPolicyClientInterface; class DeviceDescriptor; // descriptor for audio outputs. Used to maintain current configuration of each opened audio output // descriptor for audio outputs. Used to maintain current configuration of each opened audio output // and keep track of the usage of this output by each audio stream type. // and keep track of the usage of this output by each audio stream type. Loading Loading @@ -126,6 +128,31 @@ public: uint32_t mGlobalRefCount; // non-stream-specific ref count uint32_t mGlobalRefCount; // non-stream-specific ref count }; }; // Audio output driven by an input device directly. class HwAudioOutputDescriptor: public AudioOutputDescriptor { public: HwAudioOutputDescriptor(const sp<AudioSourceDescriptor>& source, AudioPolicyClientInterface *clientInterface); virtual ~HwAudioOutputDescriptor() {} status_t dump(int fd); virtual audio_devices_t supportedDevices(); virtual bool setVolume(float volume, audio_stream_type_t stream, audio_devices_t device, uint32_t delayMs, bool force); virtual void toAudioPortConfig(struct audio_port_config *dstConfig, const struct audio_port_config *srcConfig = NULL) const; virtual void toAudioPort(struct audio_port *port) const; const sp<AudioSourceDescriptor> mSource; }; class SwAudioOutputCollection : class SwAudioOutputCollection : public DefaultKeyedVector< audio_io_handle_t, sp<SwAudioOutputDescriptor> > public DefaultKeyedVector< audio_io_handle_t, sp<SwAudioOutputDescriptor> > { { Loading Loading @@ -160,4 +187,19 @@ public: status_t dump(int fd) const; status_t dump(int fd) const; }; }; class HwAudioOutputCollection : public DefaultKeyedVector< audio_io_handle_t, sp<HwAudioOutputDescriptor> > { public: bool isStreamActive(audio_stream_type_t stream, uint32_t inPastMs = 0) const; /** * return true if any output is playing anything besides the stream to ignore */ bool isAnyOutputActive(audio_stream_type_t streamToIgnore) const; status_t dump(int fd) const; }; }; // namespace android }; // namespace android Loading
services/audioflinger/PatchPanel.cpp +18 −13 Original line number Original line Diff line number Diff line Loading @@ -152,7 +152,8 @@ status_t AudioFlinger::PatchPanel::createAudioPatch(const struct audio_patch *pa return BAD_VALUE; return BAD_VALUE; } } if (patch->num_sources == 0 || patch->num_sources > AUDIO_PATCH_PORTS_MAX || if (patch->num_sources == 0 || patch->num_sources > AUDIO_PATCH_PORTS_MAX || patch->num_sinks == 0 || patch->num_sinks > AUDIO_PATCH_PORTS_MAX) { (patch->num_sinks == 0 && patch->num_sources != 2) || patch->num_sinks > AUDIO_PATCH_PORTS_MAX) { return BAD_VALUE; return BAD_VALUE; } } // limit number of sources to 1 for now or 2 sources for special cross hw module case. // limit number of sources to 1 for now or 2 sources for special cross hw module case. Loading Loading @@ -203,18 +204,18 @@ status_t AudioFlinger::PatchPanel::createAudioPatch(const struct audio_patch *pa } } // manage patches requiring a software bridge // manage patches requiring a software bridge // - special patch request with 2 sources (reuse one existing output mix) OR // - Device to device AND // - Device to device AND // - source HW module != destination HW module OR // - source HW module != destination HW module OR // - audio HAL version < 3.0 // - audio HAL version < 3.0 // - special patch request with 2 sources (reuse one existing output mix) if ((patch->num_sources == 2) || if ((patch->sinks[0].type == AUDIO_PORT_TYPE_DEVICE) && ((patch->sinks[0].type == AUDIO_PORT_TYPE_DEVICE) && ((patch->sinks[0].ext.device.hw_module != srcModule) || ((patch->sinks[0].ext.device.hw_module != srcModule) || (audioHwDevice->version() < AUDIO_DEVICE_API_VERSION_3_0) || (audioHwDevice->version() < AUDIO_DEVICE_API_VERSION_3_0)))) { (patch->num_sources == 2))) { if (patch->num_sources == 2) { if (patch->num_sources == 2) { if (patch->sources[1].type != AUDIO_PORT_TYPE_MIX || if (patch->sources[1].type != AUDIO_PORT_TYPE_MIX || patch->sinks[0].ext.device.hw_module != (patch->num_sinks != 0 && patch->sinks[0].ext.device.hw_module != patch->sources[1].ext.mix.hw_module) { patch->sources[1].ext.mix.hw_module)) { ALOGW("createAudioPatch() invalid source combination"); ALOGW("createAudioPatch() invalid source combination"); status = INVALID_OPERATION; status = INVALID_OPERATION; goto exit; goto exit; Loading Loading @@ -379,6 +380,7 @@ status_t AudioFlinger::PatchPanel::createPatchConnections(Patch *patch, } } // create patch from playback thread output to sink device // create patch from playback thread output to sink device if (audioPatch->num_sinks != 0) { patch->mPlaybackThread->getAudioPortConfig(&subPatch.sources[0]); patch->mPlaybackThread->getAudioPortConfig(&subPatch.sources[0]); subPatch.sinks[0] = audioPatch->sinks[0]; subPatch.sinks[0] = audioPatch->sinks[0]; status = createAudioPatch(&subPatch, &patch->mPlaybackPatchHandle); status = createAudioPatch(&subPatch, &patch->mPlaybackPatchHandle); Loading @@ -386,6 +388,9 @@ status_t AudioFlinger::PatchPanel::createPatchConnections(Patch *patch, patch->mPlaybackPatchHandle = AUDIO_PATCH_HANDLE_NONE; patch->mPlaybackPatchHandle = AUDIO_PATCH_HANDLE_NONE; return status; return status; } } } else { patch->mPlaybackPatchHandle = AUDIO_PATCH_HANDLE_NONE; } // use a pseudo LCM between input and output framecount // use a pseudo LCM between input and output framecount size_t playbackFrameCount = patch->mPlaybackThread->frameCount(); size_t playbackFrameCount = patch->mPlaybackThread->frameCount(); Loading
services/audioflinger/Threads.cpp +1 −1 Original line number Original line Diff line number Diff line Loading @@ -2548,7 +2548,7 @@ void AudioFlinger::PlaybackThread::invalidateTracks(audio_stream_type_t streamTy size_t size = mTracks.size(); size_t size = mTracks.size(); for (size_t i = 0; i < size; i++) { for (size_t i = 0; i < size; i++) { sp<Track> t = mTracks[i]; sp<Track> t = mTracks[i]; if (t->streamType() == streamType) { if (t->streamType() == streamType && t->isExternalTrack()) { t->invalidate(); t->invalidate(); } } } } Loading
services/audiopolicy/AudioPolicyInterface.h +2 −1 Original line number Original line Diff line number Diff line Loading @@ -225,7 +225,8 @@ public: virtual status_t startAudioSource(const struct audio_port_config *source, virtual status_t startAudioSource(const struct audio_port_config *source, const audio_attributes_t *attributes, const audio_attributes_t *attributes, audio_io_handle_t *handle) = 0; audio_io_handle_t *handle, uid_t uid) = 0; virtual status_t stopAudioSource(audio_io_handle_t handle) = 0; virtual status_t stopAudioSource(audio_io_handle_t handle) = 0; }; }; Loading
services/audiopolicy/common/managerdefinitions/Android.mk +1 −0 Original line number Original line Diff line number Diff line Loading @@ -17,6 +17,7 @@ LOCAL_SRC_FILES:= \ src/ConfigParsingUtils.cpp \ src/ConfigParsingUtils.cpp \ src/SoundTriggerSession.cpp \ src/SoundTriggerSession.cpp \ src/SessionRoute.cpp \ src/SessionRoute.cpp \ src/AudioSourceDescriptor.cpp LOCAL_SHARED_LIBRARIES := \ LOCAL_SHARED_LIBRARIES := \ libcutils \ libcutils \ Loading
services/audiopolicy/common/managerdefinitions/include/AudioOutputDescriptor.h +42 −0 Original line number Original line Diff line number Diff line Loading @@ -22,12 +22,14 @@ #include <utils/Timers.h> #include <utils/Timers.h> #include <utils/KeyedVector.h> #include <utils/KeyedVector.h> #include <system/audio.h> #include <system/audio.h> #include "AudioSourceDescriptor.h" namespace android { namespace android { class IOProfile; class IOProfile; class AudioMix; class AudioMix; class AudioPolicyClientInterface; class AudioPolicyClientInterface; class DeviceDescriptor; // descriptor for audio outputs. Used to maintain current configuration of each opened audio output // descriptor for audio outputs. Used to maintain current configuration of each opened audio output // and keep track of the usage of this output by each audio stream type. // and keep track of the usage of this output by each audio stream type. Loading Loading @@ -126,6 +128,31 @@ public: uint32_t mGlobalRefCount; // non-stream-specific ref count uint32_t mGlobalRefCount; // non-stream-specific ref count }; }; // Audio output driven by an input device directly. class HwAudioOutputDescriptor: public AudioOutputDescriptor { public: HwAudioOutputDescriptor(const sp<AudioSourceDescriptor>& source, AudioPolicyClientInterface *clientInterface); virtual ~HwAudioOutputDescriptor() {} status_t dump(int fd); virtual audio_devices_t supportedDevices(); virtual bool setVolume(float volume, audio_stream_type_t stream, audio_devices_t device, uint32_t delayMs, bool force); virtual void toAudioPortConfig(struct audio_port_config *dstConfig, const struct audio_port_config *srcConfig = NULL) const; virtual void toAudioPort(struct audio_port *port) const; const sp<AudioSourceDescriptor> mSource; }; class SwAudioOutputCollection : class SwAudioOutputCollection : public DefaultKeyedVector< audio_io_handle_t, sp<SwAudioOutputDescriptor> > public DefaultKeyedVector< audio_io_handle_t, sp<SwAudioOutputDescriptor> > { { Loading Loading @@ -160,4 +187,19 @@ public: status_t dump(int fd) const; status_t dump(int fd) const; }; }; class HwAudioOutputCollection : public DefaultKeyedVector< audio_io_handle_t, sp<HwAudioOutputDescriptor> > { public: bool isStreamActive(audio_stream_type_t stream, uint32_t inPastMs = 0) const; /** * return true if any output is playing anything besides the stream to ignore */ bool isAnyOutputActive(audio_stream_type_t streamToIgnore) const; status_t dump(int fd) const; }; }; // namespace android }; // namespace android