Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit bff67d3e authored by Mikhail Naganov's avatar Mikhail Naganov
Browse files

audio: Move StreamContext ownership out from StreamCommonImpl

Upcoming implementations of the streams of the primary module
will need to change the underlying stream type depending on
the current connected device. The stream context must persist,
thus its life time must be bound to the IStreamIn/Out implementation.
Move the StreamContext instance under ownership of StreamIn/Out.

Add StreamCommonImpl::onClose so that the owner of the context
may know when it is safe to reset it.

Re-arrange the order of the arguments when creating a stream
so that the context always comes first.

Bug: 264712385
Test: atest VtsHalAudioCoreTargetTest
Change-Id: Iaf13d4bc3a53cbfc27264d3abd1f6c417ece3941
(cherry picked from commit 6ddefdbc)
Merged-In: Iaf13d4bc3a53cbfc27264d3abd1f6c417ece3941
parent 291712fd
Loading
Loading
Loading
Loading
+2 −2
Original line number Original line Diff line number Diff line
@@ -675,7 +675,7 @@ ndk::ScopedAStatus Module::openInputStream(const OpenInputStreamArguments& in_ar
                                               nullptr, nullptr, &context));
                                               nullptr, nullptr, &context));
    context.fillDescriptor(&_aidl_return->desc);
    context.fillDescriptor(&_aidl_return->desc);
    std::shared_ptr<StreamIn> stream;
    std::shared_ptr<StreamIn> stream;
    RETURN_STATUS_IF_ERROR(createInputStream(in_args.sinkMetadata, std::move(context),
    RETURN_STATUS_IF_ERROR(createInputStream(std::move(context), in_args.sinkMetadata,
                                             mConfig->microphones, &stream));
                                             mConfig->microphones, &stream));
    StreamWrapper streamWrapper(stream);
    StreamWrapper streamWrapper(stream);
    if (auto patchIt = mPatches.find(in_args.portConfigId); patchIt != mPatches.end()) {
    if (auto patchIt = mPatches.find(in_args.portConfigId); patchIt != mPatches.end()) {
@@ -721,7 +721,7 @@ ndk::ScopedAStatus Module::openOutputStream(const OpenOutputStreamArguments& in_
                                               in_args.eventCallback, &context));
                                               in_args.eventCallback, &context));
    context.fillDescriptor(&_aidl_return->desc);
    context.fillDescriptor(&_aidl_return->desc);
    std::shared_ptr<StreamOut> stream;
    std::shared_ptr<StreamOut> stream;
    RETURN_STATUS_IF_ERROR(createOutputStream(in_args.sourceMetadata, std::move(context),
    RETURN_STATUS_IF_ERROR(createOutputStream(std::move(context), in_args.sourceMetadata,
                                              in_args.offloadInfo, &stream));
                                              in_args.offloadInfo, &stream));
    StreamWrapper streamWrapper(stream);
    StreamWrapper streamWrapper(stream);
    if (auto patchIt = mPatches.find(in_args.portConfigId); patchIt != mPatches.end()) {
    if (auto patchIt = mPatches.find(in_args.portConfigId); patchIt != mPatches.end()) {
+5 −5
Original line number Original line Diff line number Diff line
@@ -43,18 +43,18 @@ ndk::ScopedAStatus ModulePrimary::getTelephony(std::shared_ptr<ITelephony>* _aid
    return ndk::ScopedAStatus::ok();
    return ndk::ScopedAStatus::ok();
}
}


ndk::ScopedAStatus ModulePrimary::createInputStream(const SinkMetadata& sinkMetadata,
ndk::ScopedAStatus ModulePrimary::createInputStream(StreamContext&& context,
                                                    StreamContext&& context,
                                                    const SinkMetadata& sinkMetadata,
                                                    const std::vector<MicrophoneInfo>& microphones,
                                                    const std::vector<MicrophoneInfo>& microphones,
                                                    std::shared_ptr<StreamIn>* result) {
                                                    std::shared_ptr<StreamIn>* result) {
    return createStreamInstance<StreamInStub>(result, sinkMetadata, std::move(context),
    return createStreamInstance<StreamInStub>(result, std::move(context), sinkMetadata,
                                              microphones);
                                              microphones);
}
}


ndk::ScopedAStatus ModulePrimary::createOutputStream(
ndk::ScopedAStatus ModulePrimary::createOutputStream(
        const SourceMetadata& sourceMetadata, StreamContext&& context,
        StreamContext&& context, const SourceMetadata& sourceMetadata,
        const std::optional<AudioOffloadInfo>& offloadInfo, std::shared_ptr<StreamOut>* result) {
        const std::optional<AudioOffloadInfo>& offloadInfo, std::shared_ptr<StreamOut>* result) {
    return createStreamInstance<StreamOutStub>(result, sourceMetadata, std::move(context),
    return createStreamInstance<StreamOutStub>(result, std::move(context), sourceMetadata,
                                               offloadInfo);
                                               offloadInfo);
}
}


+13 −5
Original line number Original line Diff line number Diff line
@@ -663,7 +663,7 @@ ndk::ScopedAStatus StreamCommonImpl::close() {
        LOG(DEBUG) << __func__ << ": joining the worker thread...";
        LOG(DEBUG) << __func__ << ": joining the worker thread...";
        mWorker->stop();
        mWorker->stop();
        LOG(DEBUG) << __func__ << ": worker thread joined";
        LOG(DEBUG) << __func__ << ": worker thread joined";
        mContext.reset();
        onClose();
        mWorker->setClosed();
        mWorker->setClosed();
        return ndk::ScopedAStatus::ok();
        return ndk::ScopedAStatus::ok();
    } else {
    } else {
@@ -727,11 +727,15 @@ static std::map<AudioDevice, std::string> transformMicrophones(
}
}
}  // namespace
}  // namespace


StreamIn::StreamIn(const std::vector<MicrophoneInfo>& microphones)
StreamIn::StreamIn(StreamContext&& context, const std::vector<MicrophoneInfo>& microphones)
    : mMicrophones(transformMicrophones(microphones)) {
    : mContext(std::move(context)), mMicrophones(transformMicrophones(microphones)) {
    LOG(DEBUG) << __func__;
    LOG(DEBUG) << __func__;
}
}


void StreamIn::defaultOnClose() {
    mContext.reset();
}

ndk::ScopedAStatus StreamIn::getActiveMicrophones(
ndk::ScopedAStatus StreamIn::getActiveMicrophones(
        std::vector<MicrophoneDynamicInfo>* _aidl_return) {
        std::vector<MicrophoneDynamicInfo>* _aidl_return) {
    std::vector<MicrophoneDynamicInfo> result;
    std::vector<MicrophoneDynamicInfo> result;
@@ -784,11 +788,15 @@ ndk::ScopedAStatus StreamIn::setHwGain(const std::vector<float>& in_channelGains
    return ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION);
    return ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION);
}
}


StreamOut::StreamOut(const std::optional<AudioOffloadInfo>& offloadInfo)
StreamOut::StreamOut(StreamContext&& context, const std::optional<AudioOffloadInfo>& offloadInfo)
    : mOffloadInfo(offloadInfo) {
    : mContext(std::move(context)), mOffloadInfo(offloadInfo) {
    LOG(DEBUG) << __func__;
    LOG(DEBUG) << __func__;
}
}


void StreamOut::defaultOnClose() {
    mContext.reset();
}

ndk::ScopedAStatus StreamOut::updateOffloadMetadata(
ndk::ScopedAStatus StreamOut::updateOffloadMetadata(
        const AudioOffloadMetadata& in_offloadMetadata) {
        const AudioOffloadMetadata& in_offloadMetadata) {
    LOG(DEBUG) << __func__;
    LOG(DEBUG) << __func__;
+2 −2
Original line number Original line Diff line number Diff line
@@ -27,8 +27,8 @@


namespace aidl::android::hardware::audio::core {
namespace aidl::android::hardware::audio::core {


StreamAlsa::StreamAlsa(const Metadata& metadata, StreamContext&& context, int readWriteRetries)
StreamAlsa::StreamAlsa(const StreamContext& context, const Metadata& metadata, int readWriteRetries)
    : StreamCommonImpl(metadata, std::move(context)),
    : StreamCommonImpl(context, metadata),
      mFrameSizeBytes(getContext().getFrameSize()),
      mFrameSizeBytes(getContext().getFrameSize()),
      mIsInput(isInput(metadata)),
      mIsInput(isInput(metadata)),
      mConfig(alsa::getPcmConfig(getContext(), mIsInput)),
      mConfig(alsa::getPcmConfig(getContext(), mIsInput)),
+2 −2
Original line number Original line Diff line number Diff line
@@ -159,13 +159,13 @@ class Module : public BnModule {
    // The following virtual functions are intended for vendor extension via inheritance.
    // The following virtual functions are intended for vendor extension via inheritance.


    virtual ndk::ScopedAStatus createInputStream(
    virtual ndk::ScopedAStatus createInputStream(
            const ::aidl::android::hardware::audio::common::SinkMetadata& sinkMetadata,
            StreamContext&& context,
            StreamContext&& context,
            const ::aidl::android::hardware::audio::common::SinkMetadata& sinkMetadata,
            const std::vector<::aidl::android::media::audio::common::MicrophoneInfo>& microphones,
            const std::vector<::aidl::android::media::audio::common::MicrophoneInfo>& microphones,
            std::shared_ptr<StreamIn>* result) = 0;
            std::shared_ptr<StreamIn>* result) = 0;
    virtual ndk::ScopedAStatus createOutputStream(
    virtual ndk::ScopedAStatus createOutputStream(
            const ::aidl::android::hardware::audio::common::SourceMetadata& sourceMetadata,
            StreamContext&& context,
            StreamContext&& context,
            const ::aidl::android::hardware::audio::common::SourceMetadata& sourceMetadata,
            const std::optional<::aidl::android::media::audio::common::AudioOffloadInfo>&
            const std::optional<::aidl::android::media::audio::common::AudioOffloadInfo>&
                    offloadInfo,
                    offloadInfo,
            std::shared_ptr<StreamOut>* result) = 0;
            std::shared_ptr<StreamOut>* result) = 0;
Loading