Audio HAL: Add optional Destination to SinkMetadata

Currently this is used to indicate the output device
when the input stream is from an intermediate processing
module like MSD.

Bug: 120859615
Test: make
Change-Id: I60bac5c24a263ab0b8965e9dbf9514445e88c270
This commit is contained in:
Mikhail Naganov 2018-12-11 15:52:14 -08:00
parent 1bf027f79d
commit 1503a98940
8 changed files with 48 additions and 33 deletions

View file

@ -20,6 +20,7 @@ hidl_interface {
"android.hardware.audio.common@5.0",
"android.hardware.audio.effect@5.0",
"android.hidl.base@1.0",
"android.hidl.safe_union@1.0",
],
types: [
"AudioDrain",
@ -28,18 +29,13 @@ hidl_interface {
"AudioMicrophoneCoordinate",
"AudioMicrophoneDirectionality",
"AudioMicrophoneLocation",
"DeviceAddress",
"MessageQueueFlagBits",
"MicrophoneInfo",
"MmapBufferFlag",
"MmapBufferInfo",
"MmapPosition",
"ParameterValue",
"PlaybackTrackMetadata",
"RecordTrackMetadata",
"Result",
"SinkMetadata",
"SourceMetadata",
"TimeSpec",
],
gen_java: false,

View file

@ -133,7 +133,7 @@ interface IDevice {
* @param config stream configuration.
* @param flags additional flags.
* @param sinkMetadata Description of the audio that is suggested by the client.
* May be used by implementations to configure hardware effects.
* May be used by implementations to configure processing effects.
* @return retval operation completion status.
* @return inStream in case of success, created input stream.
* @return suggestedConfig in case of invalid parameters, suggested config.

View file

@ -49,34 +49,11 @@ struct TimeSpec {
uint64_t tvNSec; // nanoseconds
};
/**
* IEEE 802 MAC address.
*/
typedef uint8_t[6] MacAddress;
struct ParameterValue {
string key;
string value;
};
/**
* Specifies a device in case when several devices of the same type
* can be connected (e.g. BT A2DP, USB).
*/
struct DeviceAddress {
AudioDevice device; // discriminator
union Address {
MacAddress mac; // used for BLUETOOTH_A2DP_*
uint8_t[4] ipv4; // used for IP
struct Alsa {
int32_t card;
int32_t device;
} alsa; // used for USB_*
} address;
string busAddress; // used for BUS
string rSubmixAddress; // used for REMOTE_SUBMIX
};
enum MmapBufferFlag : uint32_t {
NONE = 0x0,
/**

View file

@ -9,6 +9,9 @@ hidl_interface {
srcs: [
"types.hal",
],
interfaces: [
"android.hidl.safe_union@1.0",
],
types: [
"AudioChannelMask",
"AudioConfig",
@ -38,7 +41,12 @@ hidl_interface {
"AudioSource",
"AudioStreamType",
"AudioUsage",
"DeviceAddress",
"FixedChannelCount",
"PlaybackTrackMetadata",
"RecordTrackMetadata",
"SinkMetadata",
"SourceMetadata",
"ThreadInfo",
"Uuid",
],

View file

@ -16,6 +16,8 @@
package android.hardware.audio.common@5.0;
import android.hidl.safe_union@1.0;
/*
*
* IDs and Handles
@ -601,6 +603,29 @@ enum AudioDevice : uint32_t {
// Note that the 2.0 IN_ALL* have been moved to helper functions
};
/**
* IEEE 802 MAC address.
*/
typedef uint8_t[6] MacAddress;
/**
* Specifies a device address in case when several devices of the same type
* can be connected (e.g. BT A2DP, USB).
*/
struct DeviceAddress {
AudioDevice device; // discriminator
union Address {
MacAddress mac; // used for BLUETOOTH_A2DP_*
uint8_t[4] ipv4; // used for IP
struct Alsa {
int32_t card;
int32_t device;
} alsa; // used for USB_*
} address;
string busAddress; // used for BUS
string rSubmixAddress; // used for REMOTE_SUBMIX
};
/**
* The audio output flags serve two purposes:
*
@ -748,9 +773,17 @@ struct RecordTrackMetadata {
* Must not be negative.
*/
float gain;
/**
* Indicates the destination of an input stream, can be left unspecified.
*/
safe_union Destination {
Monostate unspecified;
DeviceAddress device;
};
Destination destination;
};
/** Metadatas of the source of a StreamIn. */
/** Metadatas of the sink of a StreamIn. */
struct SinkMetadata {
vec<RecordTrackMetadata> tracks;
};

View file

@ -64,7 +64,7 @@ TEST_F(AudioPrimaryHidlTest, GetMicrophonesTest) {
config.sampleRateHz = 8000;
config.format = AudioFormat::PCM_16_BIT;
auto flags = hidl_bitfield<AudioInputFlag>(AudioInputFlag::NONE);
const SinkMetadata initMetadata = {{{AudioSource::MIC, 1 /* gain */}}};
const SinkMetadata initMetadata = {{{.source = AudioSource::MIC, .gain = 1}}};
EventFlag* efGroup;
for (auto microphone : microphones) {
if (microphone.deviceAddress.device != AudioDevice::IN_BUILTIN_MIC) {
@ -200,7 +200,7 @@ TEST_P(InputStreamTest, updateSinkMetadata) {
// Test all possible track configuration
for (AudioSource source : range) {
for (float volume : {0.0, 0.5, 1.0}) {
const SinkMetadata metadata = {{{source, volume}}};
const SinkMetadata metadata = {{{.source = source, .gain = volume}}};
ASSERT_OK(stream->updateSinkMetadata(metadata))
<< "source=" << toString(source) << ", volume=" << volume;
}

View file

@ -769,7 +769,7 @@ class InputStreamTest : public OpenStreamTest<IStreamIn> {
#if MAJOR_VERSION == 2
const AudioSource initMetadata = AudioSource::DEFAULT;
#elif MAJOR_VERSION >= 4
const SinkMetadata initMetadata = {{{AudioSource::DEFAULT, 1 /* gain */}}};
const SinkMetadata initMetadata = {{{.source = AudioSource::DEFAULT, .gain = 1}}};
#endif
};

View file

@ -26,6 +26,7 @@ hidl_interface {
interfaces: [
"android.hardware.audio.common@5.0",
"android.hidl.base@1.0",
"android.hidl.safe_union@1.0",
],
types: [
"AudioBuffer",