Loading audio/common/7.0/types.hal +14 −0 Original line number Diff line number Diff line Loading @@ -274,10 +274,21 @@ struct AudioConfig { uint64_t frameCount; }; /** * AudioTag is an additional use case qualifier complementing * AudioUsage and AudioContentType. Tags are set by vendor specific applications * and must be prefixed by "VX_". Vendor must namespace their tag * names to avoid conflicts. */ typedef string AudioTag; /** Metadata of a playback track for a StreamOut. */ struct PlaybackTrackMetadata { AudioUsage usage; AudioContentType contentType; /** Tags from AudioTrack audio atttributes */ vec<AudioTag> tags; AudioChannelMask channelMask; /** * Positive linear gain applied to the track samples. 0 being muted and 1 is no attenuation, * 2 means double amplification... Loading @@ -294,6 +305,9 @@ struct SourceMetadata { /** Metadata of a record track for a StreamIn. */ struct RecordTrackMetadata { AudioSource source; /** Tags from AudioTrack audio atttributes */ vec<AudioTag> tags; AudioChannelMask channelMask; /** * Positive linear gain applied to the track samples. 0 being muted and 1 is no attenuation, * 2 means double amplification... Loading audio/common/all-versions/default/HidlUtils.h +3 −0 Original line number Diff line number Diff line Loading @@ -77,6 +77,8 @@ struct HidlUtils { #endif #if MAJOR_VERSION >= 7 static constexpr char sAudioTagSeparator = ';'; static status_t audioChannelMaskFromHal(audio_channel_mask_t halChannelMask, bool isInput, AudioChannelMask* channelMask); static status_t audioChannelMasksFromHal(const std::vector<std::string>& halChannelMasks, Loading Loading @@ -126,6 +128,7 @@ struct HidlUtils { struct audio_port_config_device_ext* device, struct audio_port_config_mix_ext* mix, struct audio_port_config_session_ext* session); #endif // MAJOR_VERSION >= 7 // V4 and below have DeviceAddress defined in the 'core' interface. Loading audio/core/all-versions/default/StreamIn.cpp +69 −13 Original line number Diff line number Diff line Loading @@ -478,29 +478,85 @@ Return<void> StreamIn::debug(const hidl_handle& fd, const hidl_vec<hidl_string>& } #if MAJOR_VERSION >= 4 Return<void> StreamIn::updateSinkMetadata(const SinkMetadata& sinkMetadata) { if (mStream->update_sink_metadata == nullptr) { return Void(); // not supported by the HAL } std::vector<record_track_metadata> halTracks; halTracks.reserve(sinkMetadata.tracks.size()); for (auto& metadata : sinkMetadata.tracks) { record_track_metadata halTrackMetadata = {.gain = metadata.gain}; (void)HidlUtils::audioSourceToHal(metadata.source, &halTrackMetadata.source); record_track_metadata StreamIn::convertRecordTrackMetadata( const RecordTrackMetadata& trackMetadata) { record_track_metadata halTrackMetadata = {.gain = trackMetadata.gain}; (void)HidlUtils::audioSourceToHal(trackMetadata.source, &halTrackMetadata.source); #if MAJOR_VERSION >= 5 if (metadata.destination.getDiscriminator() == if (trackMetadata.destination.getDiscriminator() == RecordTrackMetadata::Destination::hidl_discriminator::device) { (void)deviceAddressToHal(metadata.destination.device(), &halTrackMetadata.dest_device, (void)deviceAddressToHal(trackMetadata.destination.device(), &halTrackMetadata.dest_device, halTrackMetadata.dest_device_address); } #endif halTracks.push_back(halTrackMetadata); return halTrackMetadata; } void StreamIn::doUpdateSinkMetadata(const SinkMetadata& sinkMetadata) { std::vector<record_track_metadata> halTracks; halTracks.reserve(sinkMetadata.tracks.size()); for (auto& metadata : sinkMetadata.tracks) { halTracks.push_back(convertRecordTrackMetadata(metadata)); } const sink_metadata_t halMetadata = { .track_count = halTracks.size(), .tracks = halTracks.data(), }; mStream->update_sink_metadata(mStream, &halMetadata); } #if MAJOR_VERSION >= 7 record_track_metadata_v7 StreamIn::convertRecordTrackMetadataV7( const RecordTrackMetadata& trackMetadata) { record_track_metadata_v7 halTrackMetadata; halTrackMetadata.base = convertRecordTrackMetadata(trackMetadata); (void)HidlUtils::audioChannelMaskToHal(trackMetadata.channelMask, &halTrackMetadata.channel_mask); std::string halTags; for (const auto& tag : trackMetadata.tags) { if (&tag != &trackMetadata.tags[0]) { halTags += HidlUtils::sAudioTagSeparator; } halTags += tag.c_str(); } strncpy(halTrackMetadata.tags, halTags.c_str(), AUDIO_ATTRIBUTES_TAGS_MAX_SIZE); return halTrackMetadata; } void StreamIn::doUpdateSinkMetadataV7(const SinkMetadata& sinkMetadata) { std::vector<record_track_metadata_v7> halTracks; halTracks.reserve(sinkMetadata.tracks.size()); for (auto& metadata : sinkMetadata.tracks) { halTracks.push_back(convertRecordTrackMetadataV7(metadata)); } const sink_metadata_v7_t halMetadata = { .track_count = halTracks.size(), .tracks = halTracks.data(), }; mStream->update_sink_metadata_v7(mStream, &halMetadata); } #endif // MAJOR_VERSION >= 7 Return<void> StreamIn::updateSinkMetadata(const SinkMetadata& sinkMetadata) { #if MAJOR_VERSION < 7 if (mStream->update_sink_metadata == nullptr) { return Void(); // not supported by the HAL } doUpdateSinkMetadata(sinkMetadata); #else if (mDevice->version() < AUDIO_DEVICE_API_VERSION_3_2) { if (mStream->update_sink_metadata == nullptr) { return Void(); // not supported by the HAL } doUpdateSinkMetadata(sinkMetadata); } else { if (mStream->update_sink_metadata_v7 == nullptr) { return Void(); // not supported by the HAL } doUpdateSinkMetadataV7(sinkMetadata); } #endif // MAJOR_VERSION < 7 return Void(); } Loading audio/core/all-versions/default/StreamOut.cpp +65 −9 Original line number Diff line number Diff line Loading @@ -585,26 +585,82 @@ Return<void> StreamOut::debug(const hidl_handle& fd, const hidl_vec<hidl_string> } #if MAJOR_VERSION >= 4 Return<void> StreamOut::updateSourceMetadata(const SourceMetadata& sourceMetadata) { if (mStream->update_source_metadata == nullptr) { return Void(); // not supported by the HAL playback_track_metadata StreamOut::convertPlaybackTrackMetadata( const PlaybackTrackMetadata& trackMetadata) { playback_track_metadata_t halTrackMetadata = {.gain = trackMetadata.gain}; (void)HidlUtils::audioUsageToHal(trackMetadata.usage, &halTrackMetadata.usage); (void)HidlUtils::audioContentTypeToHal(trackMetadata.contentType, &halTrackMetadata.content_type); return halTrackMetadata; } void StreamOut::doUpdateSourceMetadata(const SourceMetadata& sourceMetadata) { std::vector<playback_track_metadata_t> halTracks; halTracks.reserve(sourceMetadata.tracks.size()); for (auto& metadata : sourceMetadata.tracks) { playback_track_metadata_t halTrackMetadata = {.gain = metadata.gain}; (void)HidlUtils::audioUsageToHal(metadata.usage, &halTrackMetadata.usage); (void)HidlUtils::audioContentTypeToHal(metadata.contentType, &halTrackMetadata.content_type); halTracks.push_back(std::move(halTrackMetadata)); halTracks.push_back(convertPlaybackTrackMetadata(metadata)); } const source_metadata_t halMetadata = { .track_count = halTracks.size(), .tracks = halTracks.data(), }; mStream->update_source_metadata(mStream, &halMetadata); } #if MAJOR_VERSION >= 7 playback_track_metadata_v7 StreamOut::convertPlaybackTrackMetadataV7( const PlaybackTrackMetadata& trackMetadata) { playback_track_metadata_v7 halTrackMetadata; halTrackMetadata.base = convertPlaybackTrackMetadata(trackMetadata); (void)HidlUtils::audioChannelMaskToHal(trackMetadata.channelMask, &halTrackMetadata.channel_mask); std::string halTags; for (const auto& tag : trackMetadata.tags) { if (&tag != &trackMetadata.tags[0]) { halTags += HidlUtils::sAudioTagSeparator; } halTags += tag.c_str(); } strncpy(halTrackMetadata.tags, halTags.c_str(), AUDIO_ATTRIBUTES_TAGS_MAX_SIZE); return halTrackMetadata; } void StreamOut::doUpdateSourceMetadataV7(const SourceMetadata& sourceMetadata) { std::vector<playback_track_metadata_v7> halTracks; halTracks.reserve(sourceMetadata.tracks.size()); for (auto& metadata : sourceMetadata.tracks) { halTracks.push_back(convertPlaybackTrackMetadataV7(metadata)); } const source_metadata_v7_t halMetadata = { .track_count = halTracks.size(), .tracks = halTracks.data(), }; mStream->update_source_metadata_v7(mStream, &halMetadata); } #endif // MAJOR_VERSION >= 7 Return<void> StreamOut::updateSourceMetadata(const SourceMetadata& sourceMetadata) { #if MAJOR_VERSION < 7 if (mStream->update_source_metadata == nullptr) { return Void(); // not supported by the HAL } doUpdateSourceMetadata(sourceMetadata); #else if (mDevice->version() < AUDIO_DEVICE_API_VERSION_3_2) { if (mStream->update_source_metadata == nullptr) { return Void(); // not supported by the HAL } doUpdateSourceMetadata(sourceMetadata); } else { if (mStream->update_source_metadata_v7 == nullptr) { return Void(); // not supported by the HAL } doUpdateSourceMetadataV7(sourceMetadata); } #endif // MAJOR_VERSION < 7 return Void(); } Return<Result> StreamOut::selectPresentation(int32_t /*presentationId*/, int32_t /*programId*/) { return Result::NOT_SUPPORTED; // TODO: propagate to legacy } Loading audio/core/all-versions/default/include/core/default/Device.h +2 −2 Original line number Diff line number Diff line Loading @@ -146,6 +146,8 @@ struct Device : public IDevice, public ParametersUtil { void closeOutputStream(audio_stream_out_t* stream); audio_hw_device_t* device() const { return mDevice; } uint32_t version() const { return mDevice->common.version; } private: bool mIsClosed; audio_hw_device_t* mDevice; Loading @@ -161,8 +163,6 @@ struct Device : public IDevice, public ParametersUtil { // Methods from ParametersUtil. char* halGetParameters(const char* keys) override; int halSetParameters(const char* keysAndValues) override; uint32_t version() const { return mDevice->common.version; } }; } // namespace implementation Loading Loading
audio/common/7.0/types.hal +14 −0 Original line number Diff line number Diff line Loading @@ -274,10 +274,21 @@ struct AudioConfig { uint64_t frameCount; }; /** * AudioTag is an additional use case qualifier complementing * AudioUsage and AudioContentType. Tags are set by vendor specific applications * and must be prefixed by "VX_". Vendor must namespace their tag * names to avoid conflicts. */ typedef string AudioTag; /** Metadata of a playback track for a StreamOut. */ struct PlaybackTrackMetadata { AudioUsage usage; AudioContentType contentType; /** Tags from AudioTrack audio atttributes */ vec<AudioTag> tags; AudioChannelMask channelMask; /** * Positive linear gain applied to the track samples. 0 being muted and 1 is no attenuation, * 2 means double amplification... Loading @@ -294,6 +305,9 @@ struct SourceMetadata { /** Metadata of a record track for a StreamIn. */ struct RecordTrackMetadata { AudioSource source; /** Tags from AudioTrack audio atttributes */ vec<AudioTag> tags; AudioChannelMask channelMask; /** * Positive linear gain applied to the track samples. 0 being muted and 1 is no attenuation, * 2 means double amplification... Loading
audio/common/all-versions/default/HidlUtils.h +3 −0 Original line number Diff line number Diff line Loading @@ -77,6 +77,8 @@ struct HidlUtils { #endif #if MAJOR_VERSION >= 7 static constexpr char sAudioTagSeparator = ';'; static status_t audioChannelMaskFromHal(audio_channel_mask_t halChannelMask, bool isInput, AudioChannelMask* channelMask); static status_t audioChannelMasksFromHal(const std::vector<std::string>& halChannelMasks, Loading Loading @@ -126,6 +128,7 @@ struct HidlUtils { struct audio_port_config_device_ext* device, struct audio_port_config_mix_ext* mix, struct audio_port_config_session_ext* session); #endif // MAJOR_VERSION >= 7 // V4 and below have DeviceAddress defined in the 'core' interface. Loading
audio/core/all-versions/default/StreamIn.cpp +69 −13 Original line number Diff line number Diff line Loading @@ -478,29 +478,85 @@ Return<void> StreamIn::debug(const hidl_handle& fd, const hidl_vec<hidl_string>& } #if MAJOR_VERSION >= 4 Return<void> StreamIn::updateSinkMetadata(const SinkMetadata& sinkMetadata) { if (mStream->update_sink_metadata == nullptr) { return Void(); // not supported by the HAL } std::vector<record_track_metadata> halTracks; halTracks.reserve(sinkMetadata.tracks.size()); for (auto& metadata : sinkMetadata.tracks) { record_track_metadata halTrackMetadata = {.gain = metadata.gain}; (void)HidlUtils::audioSourceToHal(metadata.source, &halTrackMetadata.source); record_track_metadata StreamIn::convertRecordTrackMetadata( const RecordTrackMetadata& trackMetadata) { record_track_metadata halTrackMetadata = {.gain = trackMetadata.gain}; (void)HidlUtils::audioSourceToHal(trackMetadata.source, &halTrackMetadata.source); #if MAJOR_VERSION >= 5 if (metadata.destination.getDiscriminator() == if (trackMetadata.destination.getDiscriminator() == RecordTrackMetadata::Destination::hidl_discriminator::device) { (void)deviceAddressToHal(metadata.destination.device(), &halTrackMetadata.dest_device, (void)deviceAddressToHal(trackMetadata.destination.device(), &halTrackMetadata.dest_device, halTrackMetadata.dest_device_address); } #endif halTracks.push_back(halTrackMetadata); return halTrackMetadata; } void StreamIn::doUpdateSinkMetadata(const SinkMetadata& sinkMetadata) { std::vector<record_track_metadata> halTracks; halTracks.reserve(sinkMetadata.tracks.size()); for (auto& metadata : sinkMetadata.tracks) { halTracks.push_back(convertRecordTrackMetadata(metadata)); } const sink_metadata_t halMetadata = { .track_count = halTracks.size(), .tracks = halTracks.data(), }; mStream->update_sink_metadata(mStream, &halMetadata); } #if MAJOR_VERSION >= 7 record_track_metadata_v7 StreamIn::convertRecordTrackMetadataV7( const RecordTrackMetadata& trackMetadata) { record_track_metadata_v7 halTrackMetadata; halTrackMetadata.base = convertRecordTrackMetadata(trackMetadata); (void)HidlUtils::audioChannelMaskToHal(trackMetadata.channelMask, &halTrackMetadata.channel_mask); std::string halTags; for (const auto& tag : trackMetadata.tags) { if (&tag != &trackMetadata.tags[0]) { halTags += HidlUtils::sAudioTagSeparator; } halTags += tag.c_str(); } strncpy(halTrackMetadata.tags, halTags.c_str(), AUDIO_ATTRIBUTES_TAGS_MAX_SIZE); return halTrackMetadata; } void StreamIn::doUpdateSinkMetadataV7(const SinkMetadata& sinkMetadata) { std::vector<record_track_metadata_v7> halTracks; halTracks.reserve(sinkMetadata.tracks.size()); for (auto& metadata : sinkMetadata.tracks) { halTracks.push_back(convertRecordTrackMetadataV7(metadata)); } const sink_metadata_v7_t halMetadata = { .track_count = halTracks.size(), .tracks = halTracks.data(), }; mStream->update_sink_metadata_v7(mStream, &halMetadata); } #endif // MAJOR_VERSION >= 7 Return<void> StreamIn::updateSinkMetadata(const SinkMetadata& sinkMetadata) { #if MAJOR_VERSION < 7 if (mStream->update_sink_metadata == nullptr) { return Void(); // not supported by the HAL } doUpdateSinkMetadata(sinkMetadata); #else if (mDevice->version() < AUDIO_DEVICE_API_VERSION_3_2) { if (mStream->update_sink_metadata == nullptr) { return Void(); // not supported by the HAL } doUpdateSinkMetadata(sinkMetadata); } else { if (mStream->update_sink_metadata_v7 == nullptr) { return Void(); // not supported by the HAL } doUpdateSinkMetadataV7(sinkMetadata); } #endif // MAJOR_VERSION < 7 return Void(); } Loading
audio/core/all-versions/default/StreamOut.cpp +65 −9 Original line number Diff line number Diff line Loading @@ -585,26 +585,82 @@ Return<void> StreamOut::debug(const hidl_handle& fd, const hidl_vec<hidl_string> } #if MAJOR_VERSION >= 4 Return<void> StreamOut::updateSourceMetadata(const SourceMetadata& sourceMetadata) { if (mStream->update_source_metadata == nullptr) { return Void(); // not supported by the HAL playback_track_metadata StreamOut::convertPlaybackTrackMetadata( const PlaybackTrackMetadata& trackMetadata) { playback_track_metadata_t halTrackMetadata = {.gain = trackMetadata.gain}; (void)HidlUtils::audioUsageToHal(trackMetadata.usage, &halTrackMetadata.usage); (void)HidlUtils::audioContentTypeToHal(trackMetadata.contentType, &halTrackMetadata.content_type); return halTrackMetadata; } void StreamOut::doUpdateSourceMetadata(const SourceMetadata& sourceMetadata) { std::vector<playback_track_metadata_t> halTracks; halTracks.reserve(sourceMetadata.tracks.size()); for (auto& metadata : sourceMetadata.tracks) { playback_track_metadata_t halTrackMetadata = {.gain = metadata.gain}; (void)HidlUtils::audioUsageToHal(metadata.usage, &halTrackMetadata.usage); (void)HidlUtils::audioContentTypeToHal(metadata.contentType, &halTrackMetadata.content_type); halTracks.push_back(std::move(halTrackMetadata)); halTracks.push_back(convertPlaybackTrackMetadata(metadata)); } const source_metadata_t halMetadata = { .track_count = halTracks.size(), .tracks = halTracks.data(), }; mStream->update_source_metadata(mStream, &halMetadata); } #if MAJOR_VERSION >= 7 playback_track_metadata_v7 StreamOut::convertPlaybackTrackMetadataV7( const PlaybackTrackMetadata& trackMetadata) { playback_track_metadata_v7 halTrackMetadata; halTrackMetadata.base = convertPlaybackTrackMetadata(trackMetadata); (void)HidlUtils::audioChannelMaskToHal(trackMetadata.channelMask, &halTrackMetadata.channel_mask); std::string halTags; for (const auto& tag : trackMetadata.tags) { if (&tag != &trackMetadata.tags[0]) { halTags += HidlUtils::sAudioTagSeparator; } halTags += tag.c_str(); } strncpy(halTrackMetadata.tags, halTags.c_str(), AUDIO_ATTRIBUTES_TAGS_MAX_SIZE); return halTrackMetadata; } void StreamOut::doUpdateSourceMetadataV7(const SourceMetadata& sourceMetadata) { std::vector<playback_track_metadata_v7> halTracks; halTracks.reserve(sourceMetadata.tracks.size()); for (auto& metadata : sourceMetadata.tracks) { halTracks.push_back(convertPlaybackTrackMetadataV7(metadata)); } const source_metadata_v7_t halMetadata = { .track_count = halTracks.size(), .tracks = halTracks.data(), }; mStream->update_source_metadata_v7(mStream, &halMetadata); } #endif // MAJOR_VERSION >= 7 Return<void> StreamOut::updateSourceMetadata(const SourceMetadata& sourceMetadata) { #if MAJOR_VERSION < 7 if (mStream->update_source_metadata == nullptr) { return Void(); // not supported by the HAL } doUpdateSourceMetadata(sourceMetadata); #else if (mDevice->version() < AUDIO_DEVICE_API_VERSION_3_2) { if (mStream->update_source_metadata == nullptr) { return Void(); // not supported by the HAL } doUpdateSourceMetadata(sourceMetadata); } else { if (mStream->update_source_metadata_v7 == nullptr) { return Void(); // not supported by the HAL } doUpdateSourceMetadataV7(sourceMetadata); } #endif // MAJOR_VERSION < 7 return Void(); } Return<Result> StreamOut::selectPresentation(int32_t /*presentationId*/, int32_t /*programId*/) { return Result::NOT_SUPPORTED; // TODO: propagate to legacy } Loading
audio/core/all-versions/default/include/core/default/Device.h +2 −2 Original line number Diff line number Diff line Loading @@ -146,6 +146,8 @@ struct Device : public IDevice, public ParametersUtil { void closeOutputStream(audio_stream_out_t* stream); audio_hw_device_t* device() const { return mDevice; } uint32_t version() const { return mDevice->common.version; } private: bool mIsClosed; audio_hw_device_t* mDevice; Loading @@ -161,8 +163,6 @@ struct Device : public IDevice, public ParametersUtil { // Methods from ParametersUtil. char* halGetParameters(const char* keys) override; int halSetParameters(const char* keysAndValues) override; uint32_t version() const { return mDevice->common.version; } }; } // namespace implementation Loading