Loading audio/aidl/default/Android.bp +1 −0 Original line number Diff line number Diff line Loading @@ -77,6 +77,7 @@ cc_library { "r_submix/ModuleRemoteSubmix.cpp", "r_submix/SubmixRoute.cpp", "r_submix/StreamRemoteSubmix.cpp", "stub/DriverStubImpl.cpp", "stub/ModuleStub.cpp", "stub/StreamStub.cpp", "usb/ModuleUsb.cpp", Loading audio/aidl/default/include/core-impl/DriverStubImpl.h 0 → 100644 +49 −0 Original line number Diff line number Diff line /* * Copyright (C) 2024 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #pragma once #include "core-impl/Stream.h" namespace aidl::android::hardware::audio::core { class DriverStubImpl : virtual public DriverInterface { public: explicit DriverStubImpl(const StreamContext& context); ::android::status_t init() override; ::android::status_t drain(StreamDescriptor::DrainMode) override; ::android::status_t flush() override; ::android::status_t pause() override; ::android::status_t standby() override; ::android::status_t start() override; ::android::status_t transfer(void* buffer, size_t frameCount, size_t* actualFrameCount, int32_t* latencyMs) override; void shutdown() override; private: const size_t mBufferSizeFrames; const size_t mFrameSizeBytes; const int mSampleRate; const bool mIsAsynchronous; const bool mIsInput; bool mIsInitialized = false; // Used for validating the state machine logic. bool mIsStandby = true; // Used for validating the state machine logic. int64_t mStartTimeNs = 0; long mFramesSinceStart = 0; }; } // namespace aidl::android::hardware::audio::core audio/aidl/default/include/core-impl/Stream.h +3 −0 Original line number Diff line number Diff line Loading @@ -133,6 +133,9 @@ class StreamContext { ReplyMQ* getReplyMQ() const { return mReplyMQ.get(); } int getTransientStateDelayMs() const { return mDebugParameters.transientStateDelayMs; } int getSampleRate() const { return mSampleRate; } bool isInput() const { return mFlags.getTag() == ::aidl::android::media::audio::common::AudioIoFlags::input; } bool isValid() const; // 'reset' is called on a Binder thread when closing the stream. Does not use // locking because it only cleans MQ pointers which were also set on the Binder thread. Loading audio/aidl/default/include/core-impl/StreamPrimary.h +39 −28 Original line number Diff line number Diff line Loading @@ -16,25 +16,39 @@ #pragma once #include <mutex> #include <vector> #include <android-base/thread_annotations.h> #include "DriverStubImpl.h" #include "StreamAlsa.h" #include "StreamSwitcher.h" #include "primary/PrimaryMixer.h" namespace aidl::android::hardware::audio::core { class StreamPrimary : public StreamAlsa { public: StreamPrimary(StreamContext* context, const Metadata& metadata, const std::vector<::aidl::android::media::audio::common::AudioDevice>& devices); StreamPrimary(StreamContext* context, const Metadata& metadata); // Methods of 'DriverInterface'. ::android::status_t init() override; ::android::status_t drain(StreamDescriptor::DrainMode mode) override; ::android::status_t flush() override; ::android::status_t pause() override; ::android::status_t standby() override; ::android::status_t start() override; ::android::status_t transfer(void* buffer, size_t frameCount, size_t* actualFrameCount, int32_t* latencyMs) override; ::android::status_t refinePosition(StreamDescriptor::Position* position) override; void shutdown() override; // Overridden methods of 'StreamCommonImpl', called on a Binder thread. ndk::ScopedAStatus setConnectedDevices(const ConnectedDevices& devices) override; protected: std::vector<alsa::DeviceProfile> getDeviceProfiles() override; bool isStubStream(); const bool mIsAsynchronous; int64_t mStartTimeNs = 0; Loading @@ -42,12 +56,29 @@ class StreamPrimary : public StreamAlsa { bool mSkipNextTransfer = false; private: static std::pair<int, int> getCardAndDeviceId( using AlsaDeviceId = std::pair<int, int>; static constexpr StreamPrimary::AlsaDeviceId kDefaultCardAndDeviceId{ primary::PrimaryMixer::kAlsaCard, primary::PrimaryMixer::kAlsaDevice}; static constexpr StreamPrimary::AlsaDeviceId kStubDeviceId{ primary::PrimaryMixer::kInvalidAlsaCard, primary::PrimaryMixer::kInvalidAlsaDevice}; static AlsaDeviceId getCardAndDeviceId( const std::vector<::aidl::android::media::audio::common::AudioDevice>& devices); const std::pair<int, int> mCardAndDeviceId; static bool useStubStream(bool isInput, const ::aidl::android::media::audio::common::AudioDevice& device); bool isStubStreamOnWorker() const { return mCurrAlsaDeviceId == kStubDeviceId; } DriverStubImpl mStubDriver; mutable std::mutex mLock; AlsaDeviceId mAlsaDeviceId GUARDED_BY(mLock) = kStubDeviceId; // Used by the worker thread only. AlsaDeviceId mCurrAlsaDeviceId = kStubDeviceId; }; class StreamInPrimary final : public StreamIn, public StreamSwitcher, public StreamInHwGainHelper { class StreamInPrimary final : public StreamIn, public StreamPrimary, public StreamInHwGainHelper { public: friend class ndk::SharedRefBase; StreamInPrimary( Loading @@ -56,14 +87,6 @@ class StreamInPrimary final : public StreamIn, public StreamSwitcher, public Str const std::vector<::aidl::android::media::audio::common::MicrophoneInfo>& microphones); private: static bool useStubStream(const ::aidl::android::media::audio::common::AudioDevice& device); DeviceSwitchBehavior switchCurrentStream( const std::vector<::aidl::android::media::audio::common::AudioDevice>& devices) override; std::unique_ptr<StreamCommonInterfaceEx> createNewStream( const std::vector<::aidl::android::media::audio::common::AudioDevice>& devices, StreamContext* context, const Metadata& metadata) override; void onClose(StreamDescriptor::State) override { defaultOnClose(); } ndk::ScopedAStatus getHwGain(std::vector<float>* _aidl_return) override; Loading @@ -71,7 +94,7 @@ class StreamInPrimary final : public StreamIn, public StreamSwitcher, public Str }; class StreamOutPrimary final : public StreamOut, public StreamSwitcher, public StreamPrimary, public StreamOutHwVolumeHelper { public: friend class ndk::SharedRefBase; Loading @@ -81,22 +104,10 @@ class StreamOutPrimary final : public StreamOut, offloadInfo); private: static bool useStubStream(const ::aidl::android::media::audio::common::AudioDevice& device); DeviceSwitchBehavior switchCurrentStream( const std::vector<::aidl::android::media::audio::common::AudioDevice>& devices) override; std::unique_ptr<StreamCommonInterfaceEx> createNewStream( const std::vector<::aidl::android::media::audio::common::AudioDevice>& devices, StreamContext* context, const Metadata& metadata) override; void onClose(StreamDescriptor::State) override { defaultOnClose(); } ndk::ScopedAStatus getHwVolume(std::vector<float>* _aidl_return) override; ndk::ScopedAStatus setHwVolume(const std::vector<float>& in_channelVolumes) override; ndk::ScopedAStatus setConnectedDevices( const std::vector<::aidl::android::media::audio::common::AudioDevice>& devices) override; }; } // namespace aidl::android::hardware::audio::core audio/aidl/default/include/core-impl/StreamStub.h +2 −25 Original line number Diff line number Diff line Loading @@ -16,38 +16,15 @@ #pragma once #include "core-impl/DriverStubImpl.h" #include "core-impl/Stream.h" namespace aidl::android::hardware::audio::core { class StreamStub : public StreamCommonImpl { class StreamStub : public StreamCommonImpl, public DriverStubImpl { public: StreamStub(StreamContext* context, const Metadata& metadata); ~StreamStub(); // Methods of 'DriverInterface'. ::android::status_t init() override; ::android::status_t drain(StreamDescriptor::DrainMode) override; ::android::status_t flush() override; ::android::status_t pause() override; ::android::status_t standby() override; ::android::status_t start() override; ::android::status_t transfer(void* buffer, size_t frameCount, size_t* actualFrameCount, int32_t* latencyMs) override; void shutdown() override; private: const size_t mBufferSizeFrames; const size_t mFrameSizeBytes; const int mSampleRate; const bool mIsAsynchronous; const bool mIsInput; bool mIsInitialized = false; // Used for validating the state machine logic. bool mIsStandby = true; // Used for validating the state machine logic. // Used by the worker thread. int64_t mStartTimeNs = 0; long mFramesSinceStart = 0; }; class StreamInStub final : public StreamIn, public StreamStub { Loading Loading
audio/aidl/default/Android.bp +1 −0 Original line number Diff line number Diff line Loading @@ -77,6 +77,7 @@ cc_library { "r_submix/ModuleRemoteSubmix.cpp", "r_submix/SubmixRoute.cpp", "r_submix/StreamRemoteSubmix.cpp", "stub/DriverStubImpl.cpp", "stub/ModuleStub.cpp", "stub/StreamStub.cpp", "usb/ModuleUsb.cpp", Loading
audio/aidl/default/include/core-impl/DriverStubImpl.h 0 → 100644 +49 −0 Original line number Diff line number Diff line /* * Copyright (C) 2024 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #pragma once #include "core-impl/Stream.h" namespace aidl::android::hardware::audio::core { class DriverStubImpl : virtual public DriverInterface { public: explicit DriverStubImpl(const StreamContext& context); ::android::status_t init() override; ::android::status_t drain(StreamDescriptor::DrainMode) override; ::android::status_t flush() override; ::android::status_t pause() override; ::android::status_t standby() override; ::android::status_t start() override; ::android::status_t transfer(void* buffer, size_t frameCount, size_t* actualFrameCount, int32_t* latencyMs) override; void shutdown() override; private: const size_t mBufferSizeFrames; const size_t mFrameSizeBytes; const int mSampleRate; const bool mIsAsynchronous; const bool mIsInput; bool mIsInitialized = false; // Used for validating the state machine logic. bool mIsStandby = true; // Used for validating the state machine logic. int64_t mStartTimeNs = 0; long mFramesSinceStart = 0; }; } // namespace aidl::android::hardware::audio::core
audio/aidl/default/include/core-impl/Stream.h +3 −0 Original line number Diff line number Diff line Loading @@ -133,6 +133,9 @@ class StreamContext { ReplyMQ* getReplyMQ() const { return mReplyMQ.get(); } int getTransientStateDelayMs() const { return mDebugParameters.transientStateDelayMs; } int getSampleRate() const { return mSampleRate; } bool isInput() const { return mFlags.getTag() == ::aidl::android::media::audio::common::AudioIoFlags::input; } bool isValid() const; // 'reset' is called on a Binder thread when closing the stream. Does not use // locking because it only cleans MQ pointers which were also set on the Binder thread. Loading
audio/aidl/default/include/core-impl/StreamPrimary.h +39 −28 Original line number Diff line number Diff line Loading @@ -16,25 +16,39 @@ #pragma once #include <mutex> #include <vector> #include <android-base/thread_annotations.h> #include "DriverStubImpl.h" #include "StreamAlsa.h" #include "StreamSwitcher.h" #include "primary/PrimaryMixer.h" namespace aidl::android::hardware::audio::core { class StreamPrimary : public StreamAlsa { public: StreamPrimary(StreamContext* context, const Metadata& metadata, const std::vector<::aidl::android::media::audio::common::AudioDevice>& devices); StreamPrimary(StreamContext* context, const Metadata& metadata); // Methods of 'DriverInterface'. ::android::status_t init() override; ::android::status_t drain(StreamDescriptor::DrainMode mode) override; ::android::status_t flush() override; ::android::status_t pause() override; ::android::status_t standby() override; ::android::status_t start() override; ::android::status_t transfer(void* buffer, size_t frameCount, size_t* actualFrameCount, int32_t* latencyMs) override; ::android::status_t refinePosition(StreamDescriptor::Position* position) override; void shutdown() override; // Overridden methods of 'StreamCommonImpl', called on a Binder thread. ndk::ScopedAStatus setConnectedDevices(const ConnectedDevices& devices) override; protected: std::vector<alsa::DeviceProfile> getDeviceProfiles() override; bool isStubStream(); const bool mIsAsynchronous; int64_t mStartTimeNs = 0; Loading @@ -42,12 +56,29 @@ class StreamPrimary : public StreamAlsa { bool mSkipNextTransfer = false; private: static std::pair<int, int> getCardAndDeviceId( using AlsaDeviceId = std::pair<int, int>; static constexpr StreamPrimary::AlsaDeviceId kDefaultCardAndDeviceId{ primary::PrimaryMixer::kAlsaCard, primary::PrimaryMixer::kAlsaDevice}; static constexpr StreamPrimary::AlsaDeviceId kStubDeviceId{ primary::PrimaryMixer::kInvalidAlsaCard, primary::PrimaryMixer::kInvalidAlsaDevice}; static AlsaDeviceId getCardAndDeviceId( const std::vector<::aidl::android::media::audio::common::AudioDevice>& devices); const std::pair<int, int> mCardAndDeviceId; static bool useStubStream(bool isInput, const ::aidl::android::media::audio::common::AudioDevice& device); bool isStubStreamOnWorker() const { return mCurrAlsaDeviceId == kStubDeviceId; } DriverStubImpl mStubDriver; mutable std::mutex mLock; AlsaDeviceId mAlsaDeviceId GUARDED_BY(mLock) = kStubDeviceId; // Used by the worker thread only. AlsaDeviceId mCurrAlsaDeviceId = kStubDeviceId; }; class StreamInPrimary final : public StreamIn, public StreamSwitcher, public StreamInHwGainHelper { class StreamInPrimary final : public StreamIn, public StreamPrimary, public StreamInHwGainHelper { public: friend class ndk::SharedRefBase; StreamInPrimary( Loading @@ -56,14 +87,6 @@ class StreamInPrimary final : public StreamIn, public StreamSwitcher, public Str const std::vector<::aidl::android::media::audio::common::MicrophoneInfo>& microphones); private: static bool useStubStream(const ::aidl::android::media::audio::common::AudioDevice& device); DeviceSwitchBehavior switchCurrentStream( const std::vector<::aidl::android::media::audio::common::AudioDevice>& devices) override; std::unique_ptr<StreamCommonInterfaceEx> createNewStream( const std::vector<::aidl::android::media::audio::common::AudioDevice>& devices, StreamContext* context, const Metadata& metadata) override; void onClose(StreamDescriptor::State) override { defaultOnClose(); } ndk::ScopedAStatus getHwGain(std::vector<float>* _aidl_return) override; Loading @@ -71,7 +94,7 @@ class StreamInPrimary final : public StreamIn, public StreamSwitcher, public Str }; class StreamOutPrimary final : public StreamOut, public StreamSwitcher, public StreamPrimary, public StreamOutHwVolumeHelper { public: friend class ndk::SharedRefBase; Loading @@ -81,22 +104,10 @@ class StreamOutPrimary final : public StreamOut, offloadInfo); private: static bool useStubStream(const ::aidl::android::media::audio::common::AudioDevice& device); DeviceSwitchBehavior switchCurrentStream( const std::vector<::aidl::android::media::audio::common::AudioDevice>& devices) override; std::unique_ptr<StreamCommonInterfaceEx> createNewStream( const std::vector<::aidl::android::media::audio::common::AudioDevice>& devices, StreamContext* context, const Metadata& metadata) override; void onClose(StreamDescriptor::State) override { defaultOnClose(); } ndk::ScopedAStatus getHwVolume(std::vector<float>* _aidl_return) override; ndk::ScopedAStatus setHwVolume(const std::vector<float>& in_channelVolumes) override; ndk::ScopedAStatus setConnectedDevices( const std::vector<::aidl::android::media::audio::common::AudioDevice>& devices) override; }; } // namespace aidl::android::hardware::audio::core
audio/aidl/default/include/core-impl/StreamStub.h +2 −25 Original line number Diff line number Diff line Loading @@ -16,38 +16,15 @@ #pragma once #include "core-impl/DriverStubImpl.h" #include "core-impl/Stream.h" namespace aidl::android::hardware::audio::core { class StreamStub : public StreamCommonImpl { class StreamStub : public StreamCommonImpl, public DriverStubImpl { public: StreamStub(StreamContext* context, const Metadata& metadata); ~StreamStub(); // Methods of 'DriverInterface'. ::android::status_t init() override; ::android::status_t drain(StreamDescriptor::DrainMode) override; ::android::status_t flush() override; ::android::status_t pause() override; ::android::status_t standby() override; ::android::status_t start() override; ::android::status_t transfer(void* buffer, size_t frameCount, size_t* actualFrameCount, int32_t* latencyMs) override; void shutdown() override; private: const size_t mBufferSizeFrames; const size_t mFrameSizeBytes; const int mSampleRate; const bool mIsAsynchronous; const bool mIsInput; bool mIsInitialized = false; // Used for validating the state machine logic. bool mIsStandby = true; // Used for validating the state machine logic. // Used by the worker thread. int64_t mStartTimeNs = 0; long mFramesSinceStart = 0; }; class StreamInStub final : public StreamIn, public StreamStub { Loading