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

Commit 5404a007 authored by Mikhail Naganov's avatar Mikhail Naganov
Browse files

audio: Update source / sink metadata after opening stream

Since open input / output stream functions in legacy audio
HAL API do not have parameters for source / sink metadata,
make a call to update metadata right after opening a stream
in the default implementation.

Bug: 120859615
Test: audio still works
Change-Id: Ie81f861a024261a1f13fb6aa23976a92658e679c
parent 27b2bc77
Loading
Loading
Loading
Loading
+56 −21
Original line number Diff line number Diff line
@@ -137,12 +137,11 @@ Return<void> Device::getInputBufferSize(const AudioConfig& config, getInputBuffe
    return Void();
}

Return<void> Device::openOutputStream(int32_t ioHandle, const DeviceAddress& device,
                                      const AudioConfig& config, AudioOutputFlagBitfield flags,
#if MAJOR_VERSION >= 4
                                      const SourceMetadata& /* sourceMetadata */,
#endif
                                      openOutputStream_cb _hidl_cb) {
std::tuple<Result, sp<IStreamOut>> Device::openOutputStreamImpl(int32_t ioHandle,
                                                                const DeviceAddress& device,
                                                                const AudioConfig& config,
                                                                AudioOutputFlagBitfield flags,
                                                                AudioConfig* suggestedConfig) {
    audio_config_t halConfig;
    HidlUtils::audioConfigToHal(config, &halConfig);
    audio_stream_out_t* halStream;
@@ -161,16 +160,13 @@ Return<void> Device::openOutputStream(int32_t ioHandle, const DeviceAddress& dev
    if (status == OK) {
        streamOut = new StreamOut(this, halStream);
    }
    AudioConfig suggestedConfig;
    HidlUtils::audioConfigFromHal(halConfig, &suggestedConfig);
    _hidl_cb(analyzeStatus("open_output_stream", status, {EINVAL} /* ignore */), streamOut,
             suggestedConfig);
    return Void();
    HidlUtils::audioConfigFromHal(halConfig, suggestedConfig);
    return {analyzeStatus("open_output_stream", status, {EINVAL} /*ignore*/), streamOut};
}

Return<void> Device::openInputStream(int32_t ioHandle, const DeviceAddress& device,
                                     const AudioConfig& config, AudioInputFlagBitfield flags,
                                     AudioSource source, openInputStream_cb _hidl_cb) {
std::tuple<Result, sp<IStreamIn>> Device::openInputStreamImpl(
    int32_t ioHandle, const DeviceAddress& device, const AudioConfig& config,
    AudioInputFlagBitfield flags, AudioSource source, AudioConfig* suggestedConfig) {
    audio_config_t halConfig;
    HidlUtils::audioConfigToHal(config, &halConfig);
    audio_stream_in_t* halStream;
@@ -190,14 +186,46 @@ Return<void> Device::openInputStream(int32_t ioHandle, const DeviceAddress& devi
    if (status == OK) {
        streamIn = new StreamIn(this, halStream);
    }
    HidlUtils::audioConfigFromHal(halConfig, suggestedConfig);
    return {analyzeStatus("open_input_stream", status, {EINVAL} /*ignore*/), streamIn};
}

#if MAJOR_VERSION == 2
Return<void> Device::openOutputStream(int32_t ioHandle, const DeviceAddress& device,
                                      const AudioConfig& config, AudioOutputFlagBitfield flags,
                                      openOutputStream_cb _hidl_cb) {
    AudioConfig suggestedConfig;
    HidlUtils::audioConfigFromHal(halConfig, &suggestedConfig);
    _hidl_cb(analyzeStatus("open_input_stream", status, {EINVAL} /* ignore */), streamIn,
             suggestedConfig);
    auto [result, streamOut] =
        openOutputStreamImpl(ioHandle, device, config, flags, &suggestedConfig);
    _hidl_cb(result, streamOut, suggestedConfig);
    return Void();
}

Return<void> Device::openInputStream(int32_t ioHandle, const DeviceAddress& device,
                                     const AudioConfig& config, AudioInputFlagBitfield flags,
                                     AudioSource source, openInputStream_cb _hidl_cb) {
    AudioConfig suggestedConfig;
    auto [result, streamIn] =
        openInputStreamImpl(ioHandle, device, config, flags, source, &suggestedConfig);
    _hidl_cb(result, streamIn, suggestedConfig);
    return Void();
}

#elif MAJOR_VERSION >= 4
Return<void> Device::openOutputStream(int32_t ioHandle, const DeviceAddress& device,
                                      const AudioConfig& config, AudioOutputFlagBitfield flags,
                                      const SourceMetadata& sourceMetadata,
                                      openOutputStream_cb _hidl_cb) {
    AudioConfig suggestedConfig;
    auto [result, streamOut] =
        openOutputStreamImpl(ioHandle, device, config, flags, &suggestedConfig);
    if (streamOut) {
        streamOut->updateSourceMetadata(sourceMetadata);
    }
    _hidl_cb(result, streamOut, suggestedConfig);
    return Void();
}

#if MAJOR_VERSION >= 4
Return<void> Device::openInputStream(int32_t ioHandle, const DeviceAddress& device,
                                     const AudioConfig& config, AudioInputFlagBitfield flags,
                                     const SinkMetadata& sinkMetadata,
@@ -209,11 +237,18 @@ Return<void> Device::openInputStream(int32_t ioHandle, const DeviceAddress& devi
        _hidl_cb(Result::INVALID_ARGUMENTS, nullptr, AudioConfig());
        return Void();
    }
    // Pick the first one as the main until the legacy API is update
    // Pick the first one as the main.
    AudioSource source = sinkMetadata.tracks[0].source;
    return openInputStream(ioHandle, device, config, flags, source, _hidl_cb);
    AudioConfig suggestedConfig;
    auto [result, streamIn] =
        openInputStreamImpl(ioHandle, device, config, flags, source, &suggestedConfig);
    if (streamIn) {
        streamIn->updateSinkMetadata(sinkMetadata);
    }
#endif
    _hidl_cb(result, streamIn, suggestedConfig);
    return Void();
}
#endif /* MAJOR_VERSION */

Return<bool> Device::supportsAudioPatches() {
    return version() >= AUDIO_DEVICE_API_VERSION_3_0;
+13 −2
Original line number Diff line number Diff line
@@ -454,8 +454,19 @@ Return<void> StreamIn::updateSinkMetadata(const SinkMetadata& sinkMetadata) {
    std::vector<record_track_metadata> halTracks;
    halTracks.reserve(sinkMetadata.tracks.size());
    for (auto& metadata : sinkMetadata.tracks) {
        halTracks.push_back(
            {.source = static_cast<audio_source_t>(metadata.source), .gain = metadata.gain});
        record_track_metadata halTrackMetadata = {
            .source = static_cast<audio_source_t>(metadata.source), .gain = metadata.gain};
#if MAJOR_VERSION >= 5
        if (metadata.destination.getDiscriminator() ==
            RecordTrackMetadata::Destination::hidl_discriminator::device) {
            halTrackMetadata.dest_device =
                static_cast<audio_devices_t>(metadata.destination.device().device);
            strncpy(halTrackMetadata.dest_device_address,
                    deviceAddressToHal(metadata.destination.device()).c_str(),
                    AUDIO_DEVICE_MAX_ADDRESS_LEN);
        }
#endif
        halTracks.push_back(halTrackMetadata);
    }
    const sink_metadata_t halMetadata = {
        .track_count = halTracks.size(),
+11 −4
Original line number Diff line number Diff line
@@ -62,14 +62,21 @@ struct Device : public IDevice, public ParametersUtil {
    Return<void> getInputBufferSize(const AudioConfig& config,
                                    getInputBufferSize_cb _hidl_cb) override;

    // V2 openInputStream is called by V4 input stream thus present in both versions
    Return<void> openInputStream(int32_t ioHandle, const DeviceAddress& device,
                                 const AudioConfig& config, AudioInputFlagBitfield flags,
                                 AudioSource source, openInputStream_cb _hidl_cb);
    std::tuple<Result, sp<IStreamOut>> openOutputStreamImpl(int32_t ioHandle,
                                                            const DeviceAddress& device,
                                                            const AudioConfig& config,
                                                            AudioOutputFlagBitfield flags,
                                                            AudioConfig* suggestedConfig);
    std::tuple<Result, sp<IStreamIn>> openInputStreamImpl(
        int32_t ioHandle, const DeviceAddress& device, const AudioConfig& config,
        AudioInputFlagBitfield flags, AudioSource source, AudioConfig* suggestedConfig);
#if MAJOR_VERSION == 2
    Return<void> openOutputStream(int32_t ioHandle, const DeviceAddress& device,
                                  const AudioConfig& config, AudioOutputFlagBitfield flags,
                                  openOutputStream_cb _hidl_cb) override;
    Return<void> openInputStream(int32_t ioHandle, const DeviceAddress& device,
                                 const AudioConfig& config, AudioInputFlagBitfield flags,
                                 AudioSource source, openInputStream_cb _hidl_cb) override;
#elif MAJOR_VERSION >= 4
    Return<void> openOutputStream(int32_t ioHandle, const DeviceAddress& device,
                                  const AudioConfig& config, AudioOutputFlagBitfield flags,