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

Commit 6109cdbc authored by Eric Laurent's avatar Eric Laurent Committed by Mikhail Naganov
Browse files

Audio HAL: add channel mask and tags to track metadata

Add channel mask and audio attributes tags to playback
and record track metadata sent to audio HAL.

Bug: 168751366
Test: make
Change-Id: I06a63963e1be53bd965792dec607fa67a89f28bf
Merged-In: I06a63963e1be53bd965792dec607fa67a89f28bf
parent b572b63b
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -114,6 +114,8 @@ class DeviceHalLocal : public DeviceHalInterface
    void closeOutputStream(struct audio_stream_out *stream_out);
    void closeInputStream(struct audio_stream_in *stream_in);

    uint32_t version() const { return mDev->common.version; }

  private:
    audio_hw_device_t *mDev;

@@ -124,8 +126,6 @@ class DeviceHalLocal : public DeviceHalInterface

    // The destructor automatically closes the device.
    virtual ~DeviceHalLocal();

    uint32_t version() const { return mDev->common.version; }
};

} // namespace CPP_VERSION
+35 −9
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@

#include "DeviceHalHidl.h"
#include "EffectHalHidl.h"
#include "HidlUtils.h"
#include "StreamHalHidl.h"
#include "VersionUtils.h"

@@ -610,12 +611,25 @@ status_t StreamOutHalHidl::updateSourceMetadata(
        const StreamOutHalInterface::SourceMetadata& sourceMetadata) {
    CPP_VERSION::SourceMetadata halMetadata = {
        .tracks = transformToHidlVec(sourceMetadata.tracks,
              [](const playback_track_metadata& metadata) -> PlaybackTrackMetadata {
                  return {
                    .usage=static_cast<AudioUsage>(metadata.usage),
                    .contentType=static_cast<AudioContentType>(metadata.content_type),
                    .gain=metadata.gain,
              [](const playback_track_metadata_v7& metadata) -> PlaybackTrackMetadata {
                  PlaybackTrackMetadata halTrackMetadata = {
                      .usage=static_cast<AudioUsage>(metadata.base.usage),
                      .contentType=static_cast<AudioContentType>(metadata.base.content_type),
                      .gain=metadata.base.gain,
                  };
#if MAJOR_VERSION >= 7
                  HidlUtils::audioChannelMaskFromHal(metadata.channel_mask, false /*isInput*/,
                                                    &halTrackMetadata.channelMask);

                  std::istringstream tags{metadata.tags};
                  std::string tag;
                  while (std::getline(tags, tag, HidlUtils::sAudioTagSeparator)) {
                      if (!tag.empty()) {
                          halTrackMetadata.tags.push_back(tag);
                      }
                  }
#endif
                  return halTrackMetadata;
              })};
    return processReturn("updateSourceMetadata", mStream->updateSourceMetadata(halMetadata));
}
@@ -902,11 +916,23 @@ status_t StreamInHalHidl::updateSinkMetadata(const
        StreamInHalInterface::SinkMetadata& sinkMetadata) {
    CPP_VERSION::SinkMetadata halMetadata = {
        .tracks = transformToHidlVec(sinkMetadata.tracks,
              [](const record_track_metadata& metadata) -> RecordTrackMetadata {
                  return {
                    .source=static_cast<AudioSource>(metadata.source),
                    .gain=metadata.gain,
              [](const record_track_metadata_v7& metadata) -> RecordTrackMetadata {
                  RecordTrackMetadata halTrackMetadata = {
                      .source=static_cast<AudioSource>(metadata.base.source),
                      .gain=metadata.base.gain,
                  };
#if MAJOR_VERSION >= 7
                  HidlUtils::audioChannelMaskFromHal(metadata.channel_mask, true /*isInput*/,
                                                    &halTrackMetadata.channelMask);
                  std::istringstream tags{metadata.tags};
                  std::string tag;
                  while (std::getline(tags, tag, HidlUtils::sAudioTagSeparator)) {
                      if (!tag.empty()) {
                          halTrackMetadata.tags.push_back(tag);
                      }
                  }
#endif
                  return halTrackMetadata;
              })};
    return processReturn("updateSinkMetadata", mStream->updateSinkMetadata(halMetadata));
}
+83 −11
Original line number Diff line number Diff line
@@ -241,19 +241,55 @@ status_t StreamOutHalLocal::getPresentationPosition(uint64_t *frames, struct tim
    return mStream->get_presentation_position(mStream, frames, timestamp);
}

status_t StreamOutHalLocal::updateSourceMetadata(const SourceMetadata& sourceMetadata) {
    if (mStream->update_source_metadata == nullptr) {
        return INVALID_OPERATION;
void StreamOutHalLocal::doUpdateSourceMetadata(const SourceMetadata& sourceMetadata) {
    std::vector<playback_track_metadata> halTracks;
    halTracks.reserve(sourceMetadata.tracks.size());
    for (auto& metadata : sourceMetadata.tracks) {
        playback_track_metadata halTrackMetadata;
        playback_track_metadata_from_v7(&halTrackMetadata, &metadata);
        halTracks.push_back(halTrackMetadata);
    }
    const source_metadata_t halMetadata = {
        .track_count = halTracks.size(),
        .tracks = halTracks.data(),
    };
    mStream->update_source_metadata(mStream, &halMetadata);
}

#if MAJOR_VERSION >= 7
void StreamOutHalLocal::doUpdateSourceMetadataV7(const SourceMetadata& sourceMetadata) {
    const source_metadata_t metadata {
        .track_count = sourceMetadata.tracks.size(),
        // const cast is fine as it is in a const structure
        .tracks = const_cast<playback_track_metadata*>(sourceMetadata.tracks.data()),
        .tracks = const_cast<playback_track_metadata_v7*>(sourceMetadata.tracks.data()),
    };
    mStream->update_source_metadata(mStream, &metadata);
    mStream->update_source_metadata_v7(mStream, &metadata);
}
#endif

status_t StreamOutHalLocal::updateSourceMetadata(const SourceMetadata& sourceMetadata) {
#if MAJOR_VERSION < 7
    if (mStream->update_source_metadata == nullptr) {
        return INVALID_OPERATION;
    }
    doUpdateSourceMetadata(sourceMetadata);
#else
    if (mDevice->version() < AUDIO_DEVICE_API_VERSION_3_2)
        if (mStream->update_source_metadata == nullptr) {
            return INVALID_OPERATION;
        }
        doUpdateSourceMetadata(sourceMetadata);
    } else {
        if (mStream->update_source_metadata_v7 == nullptr) {
            return INVALID_OPERATION;
        }
        doUpdateSourceMetadataV7(sourceMetadata);
    }
#endif
    return OK;
}


status_t StreamOutHalLocal::start() {
    if (mStream->start == NULL) return INVALID_OPERATION;
    return mStream->start(mStream);
@@ -352,16 +388,52 @@ status_t StreamInHalLocal::getCapturePosition(int64_t *frames, int64_t *time) {
    return mStream->get_capture_position(mStream, frames, time);
}

status_t StreamInHalLocal::updateSinkMetadata(const SinkMetadata& sinkMetadata) {
    if (mStream->update_sink_metadata == nullptr) {
        return INVALID_OPERATION;
void StreamInHalLocal::doUpdateSinkMetadata(const SinkMetadata& sinkMetadata) {
    std::vector<record_track_metadata> halTracks;
    halTracks.reserve(sinkMetadata.tracks.size());
    for (auto& metadata : sinkMetadata.tracks) {
        record_track_metadata halTrackMetadata;
        record_track_metadata_from_v7(&halTrackMetadata, &metadata);
        halTracks.push_back(halTrackMetadata);
    }
    const sink_metadata_t halMetadata = {
        .track_count = halTracks.size(),
        .tracks = halTracks.data(),
    };
    mStream->update_sink_metadata(mStream, &halMetadata);
}
    const sink_metadata_t metadata {

#if MAJOR_VERSION >= 7
void StreamInHalLocal::doUpdateSinkMetadataV7(const SinkMetadata& sinkMetadata) {
    const sink_metadata_v7_t halMetadata {
        .track_count = sinkMetadata.tracks.size(),
        // const cast is fine as it is in a const structure
        .tracks = const_cast<record_track_metadata*>(sinkMetadata.tracks.data()),
        .tracks = const_cast<record_track_metadata_v7*>(sinkMetadata.tracks.data()),
    };
    mStream->update_sink_metadata(mStream, &metadata);
    mStream->update_sink_metadata_v7(mStream, &halMetadata);
}
#endif

status_t StreamInHalLocal::updateSinkMetadata(const SinkMetadata& sinkMetadata) {
#if MAJOR_VERSION < 7

    if (mStream->update_sink_metadata == nullptr) {
        return INVALID_OPERATION;  // not supported by the HAL
    }
    doUpdateSinkMetadata(sinkMetadata);
#else
    if (mDevice->version() < AUDIO_DEVICE_API_VERSION_3_2)
        if (mStream->update_sink_metadata == nullptr) {
            return INVALID_OPERATION;  // not supported by the HAL
        }
        doUpdateSinkMetadata(sinkMetadata);
    } else {
        if (mStream->update_sink_metadata_v7 == nullptr) {
            return INVALID_OPERATION;  // not supported by the HAL
        }
        doUpdateSinkMetadataV7(sinkMetadata);
    }
#endif
    return OK;
}

+6 −0
Original line number Diff line number Diff line
@@ -173,6 +173,9 @@ class StreamOutHalLocal : public StreamOutHalInterface, public StreamHalLocal {
    static int asyncCallback(stream_callback_event_t event, void *param, void *cookie);

    static int asyncEventCallback(stream_event_callback_type_t event, void *param, void *cookie);

    void doUpdateSourceMetadataV7(const SourceMetadata& sourceMetadata);
    void doUpdateSourceMetadata(const SourceMetadata& sourceMetadata);
};

class StreamInHalLocal : public StreamInHalInterface, public StreamHalLocal {
@@ -227,6 +230,9 @@ class StreamInHalLocal : public StreamInHalInterface, public StreamHalLocal {
    StreamInHalLocal(audio_stream_in_t *stream, sp<DeviceHalLocal> device);

    virtual ~StreamInHalLocal();

    void doUpdateSinkMetadata(const SinkMetadata& sinkMetadata);
    void doUpdateSinkMetadataV7(const SinkMetadata& sinkMetadata);
};

} // namespace CPP_VERSION
+2 −2
Original line number Diff line number Diff line
@@ -158,7 +158,7 @@ class StreamOutHalInterface : public virtual StreamHalInterface {
    virtual status_t getPresentationPosition(uint64_t *frames, struct timespec *timestamp) = 0;

    struct SourceMetadata {
        std::vector<playback_track_metadata_t> tracks;
        std::vector<playback_track_metadata_v7_t> tracks;
    };
    /**
     * Called when the metadata of the stream's source has been changed.
@@ -197,7 +197,7 @@ class StreamInHalInterface : public virtual StreamHalInterface {
    virtual status_t setPreferredMicrophoneFieldDimension(float zoom) = 0;

    struct SinkMetadata {
        std::vector<record_track_metadata_t> tracks;
        std::vector<record_track_metadata_v7_t> tracks;
    };
    /**
     * Called when the metadata of the stream's sink has been changed.
Loading