协议
DelayWatcher
在 fuchsia.audio/delay.fidl 中定义
留意延迟的变化。
WatchDelay
第一个调用会立即返回当前延迟(如果已知的话)。 后续调用会阻塞,直到延迟发生变化。最多只能有一个 未完成的通话,否则该频道可能会被关闭。
请求
名称 | 类型 |
---|---|
payload |
DelayWatcherWatchDelayRequest
|
响应
名称 | 类型 |
---|---|
payload |
DelayWatcherWatchDelayResponse
|
GainControl
在 fuchsia.audio/gain.fidl 中定义
支持控制和监控音频增益。该接口通常是 其他接口的剥离
旋钮
此接口公开了两个正交的旋钮:
-
增益旋钮可控制“相对分贝”中的单个值。值为 0 表示无增益,正值会增加增益,负值 降低增益。根据上下文,可能会相对于 输入流或相对于某个绝对参考点(例如 扬声器的最大音量。
此旋钮未定义最大值或最小值。个人 实现可能会限制实现定义的最大值或 将所有值低于实现定义的最低当量值 设为“静音”,但这不是必须的。
-
静音旋钮控制单个布尔值。当
true
时, GainControl 被静音,并且有效增益为负无穷大。时间false
,增益由增益旋钮控制。
调度
您可以在增益和静音旋钮的调整时间 。调度在相对于参考时钟的时间戳上进行 必须在创建此协议时建立。
TODO(https://fxbug.dev/42176154):调度语义可能会发生变化
SetGain
设置增益旋钮。
请求
名称 | 类型 |
---|---|
payload |
GainControlSetGainRequest
|
响应
名称 | 类型 |
---|---|
payload |
GainControl_SetGain_Result
|
SetMute
设置静音旋钮。
请求
名称 | 类型 |
---|---|
payload |
GainControlSetMuteRequest
|
响应
名称 | 类型 |
---|---|
payload |
GainControl_SetMute_Result
|
StreamSink
在 fuchsia.audio/stream_sink.fidl 中定义
用于跨进程音频流传输的数据包接收器,由音频使用者实现并用于 音频制作商
结束
表示已达到数据流结尾。音频渲染器等使用方
当流结束之前的最后一个数据包已呈现时,向客户端发送信号,
例如,客户端知道何时更改播放器的界面状态,让用户知道
播放完毕。此方法在逻辑上将作用域限定为当前片段。答
此请求之后可能会发出 SetSegment
请求和(通常)更多数据包。
请求
<空>
OnWillClose
在消费者关闭之前发送,说明消费者关闭 连接。发送此事件后,使用方必须避免再发送 消息并立即关闭连接。
响应
名称 | 类型 |
---|---|
payload |
StreamSinkOnWillCloseRequest
|
PutPacket
将数据包放入接收器。
请求
名称 | 类型 |
---|---|
payload |
StreamSinkPutPacketRequest
|
StartSegment
开始一个新细分。在此请求之后和下一个此类请求之前的数据包 分配给该细分受众群
请求
名称 | 类型 |
---|---|
payload |
StreamSinkStartSegmentRequest
|
WillClose
在生产方关闭前立即发送,指明生产方为何要关闭 连接。发送此请求后,提供方必须避免再发送 消息并立即关闭连接。
请求
名称 | 类型 |
---|---|
payload |
StreamSinkWillCloseRequest
|
结构体
UnspecifiedBestEffort
在 fuchsia.audio/stream_sink.fidl 中定义
<空>
UnspecifiedContinuous
在 fuchsia.audio/stream_sink.fidl 中定义
<空>
精英
ChannelConfig 柔性
类型:uint32
在 fuchsia.audio/format.fidl 中定义
频道的空间分配。
名称 | 值 | 说明 |
---|---|---|
单色 |
1 |
Front.C(中央) |
STEREO |
2 |
前左(左)|前右(右) |
四 |
3 |
Front.L |前右 |Back.L |Back.R,也称为“四个角” |
SURROUND_3 |
4 |
Front.L |前右 |Back.C,也称为“LRS” |
SURROUND_4 |
5 |
Front.L |前右 |Front.C |Back.C,也称为“LRCS” |
SURROUND_5_1 |
6 |
Front.L |前右 |Front.C |LFE |Side.L |Side.R |
CompressionType 柔性
类型:uint32
在 fuchsia.audio/compression.fidl 中定义
名称 | 值 | 说明 |
---|---|---|
无 |
0 |
|
AAC |
1 |
|
AACLATM |
2 |
|
AMRNB |
3 |
|
AMRWB |
4 |
|
APTX |
5 |
|
FLAC |
6 |
|
GSMMS |
7 |
|
MP3 |
8 |
|
PCMALAW |
9 |
|
PCMMULAW |
10 |
|
SBC |
11 |
|
VORBIS |
12 |
|
OPUS |
13 |
GainError 柔性环境
类型:uint32
在 fuchsia.audio/gain.fidl 中定义
GainControl
返回的错误类型。
名称 | 值 | 说明 |
---|---|---|
MISSING_REQUIRED_FIELD |
1 |
未提供必填字段。 |
UNSUPPORTED_OPTION |
2 |
灵活字段包含不受支持的选项。如果存在这种情况, 使用 API 版本 X+1 构建的客户端与使用 API 构建的服务器通信 X 版。 |
SampleType 柔性环境
类型:uint32
在 fuchsia.audio/format.fidl 中定义
表示各个音频样本的类型。
名称 | 值 | 说明 |
---|---|---|
UINT_8 |
1 |
|
INT_16 |
2 |
|
INT_32 |
3 |
|
FLOAT_32 |
4 |
|
FLOAT_64 |
5 |
表格
“Compression”(压缩)
在 fuchsia.audio/compression.fidl 中定义
描述应用于数据流的压缩。
Ordinal | 字段 | 类型 | 说明 |
---|---|---|---|
1 |
type |
CompressionType
|
应用于音频流的压缩类型。 |
2 |
oob_parameters |
vector<uint8>[32768]
|
描述流压缩的不透明“带外”参数。此
此字段是 |
DelayWatcherWatchDelayRequest
在 fuchsia.audio/delay.fidl 中定义
Ordinal | 字段 | 类型 | 说明 |
---|
DelayWatcherWatchDelayResponse
在 fuchsia.audio/delay.fidl 中定义
Ordinal | 字段 | 类型 | 说明 |
---|---|---|---|
1 |
delay |
zx/Duration
|
可选。如果未指定,则延迟未知。 |
格式
在 fuchsia.audio/format.fidl 中定义
描述不考虑压缩的用于音频流的格式。地点
支持压缩,此类型应与 fuchsia.media2.Compression
结合使用。
未压缩的音频流使用 LPCM 编码。
Ordinal | 字段 | 类型 | 说明 |
---|---|---|---|
1 |
sample_type |
SampleType
|
单个样本的类型。 |
2 |
channel_count |
uint32
|
每帧的样本数。 |
3 |
frames_per_second |
uint32
|
每秒帧数。 |
4 |
channel_layout |
ChannelLayout
|
每个声道的空间分配。 |
GainControlSetGainRequest
在 fuchsia.audio/gain.fidl 中定义
Ordinal | 字段 | 类型 | 说明 |
---|---|---|---|
1 |
how |
GainUpdateMethod
|
如何更新增益旋钮。 必填。 |
2 |
when |
fuchsia.media2/RealTime
|
何时应用此更新。 必填。 |
GainControlSetMuteRequest
在 fuchsia.audio/gain.fidl 中定义
Ordinal | 字段 | 类型 | 说明 |
---|---|---|---|
1 |
muted |
bool
|
静音旋钮的新值。 必填。 |
2 |
when |
fuchsia.media2/RealTime
|
何时应用此更新。 必填。 |
GainControl_SetGain_Response
在 fuchsia.audio/gain.fidl 中定义
Ordinal | 字段 | 类型 | 说明 |
---|
GainControl_SetMute_Response
在 fuchsia.audio/gain.fidl 中定义
Ordinal | 字段 | 类型 | 说明 |
---|
包
在 fuchsia.audio/stream_sink.fidl 中定义
描述通过 StreamSink
传送的数据包。
Ordinal | 字段 | 类型 | 说明 |
---|---|---|---|
1 |
payload |
fuchsia.media2/PayloadRange
|
此数据包的载荷的位置。必须填写此字段。 |
2 |
timestamp |
Timestamp
|
指示应提供此数据包的时间戳。省略此字段意味着
|
3 |
capture_timestamp |
zx/Time
|
捕获此数据包的时间,以系统单调时间值表示。此字段是可选字段 可以由捕获器设置,以指示捕获此数据包的时间。 |
4 |
flags |
PacketFlags
|
描述数据包的标志。省略此字段意味着所有标志都清除。 |
5 |
front_frames_to_drop |
uint32
|
指示应该从 解码器。只能为压缩的流提供此值。 如果省略此字段,则不应丢弃任何前帧。 |
6 |
back_frames_to_drop |
uint32
|
指示应该从 解码器。只能为压缩的流提供此值。 如果省略此字段,则不应丢弃任何返回帧。 |
7 |
encryption_properties |
fuchsia.drm/PacketEncryptionProperties
|
说明应用于此数据包的加密。省略此字段意味着该数据包 未加密。 |
RampFunctionLinearSlope
在 fuchsia.audio/gain.fidl 中定义
增益在线性域上呈现线性斜率。
例如,从 -2.3dB 到 -1.6dB 的斜坡就是线性 从 0.1 到 0.5。如果延迟时长超过 4 毫秒, 获得更新:
- 在 0 毫秒时,增益 = 0.1 = -2.3dB
- 在 1 毫秒时,增益 = 0.2 = -2.0dB
- 在 2 毫秒时,增益 = 0.3 = -1.8dB
- 在 3 毫秒时,增益 = 0.4 = -1.7dB
- 4 毫秒时,增益 = 0.5 = -1.6dB
请注意,dB 的变化遵循对数(非线性)曲线。
Ordinal | 字段 | 类型 | 说明 |
---|
RampedGain
在 fuchsia.audio/gain.fidl 中定义
描述增量增益命令。应用此命令时,增益 超过指定的 持续时间。
Ordinal | 字段 | 类型 | 说明 |
---|---|---|---|
1 |
target_gain_db |
float32
|
|
2 |
duration |
zx/Duration
|
|
3 |
function |
RampFunction
|
RingBuffer 资源
在 fuchsia.audio/ring_buffer.fidl 中定义
音频数据的环形缓冲区。
每个环形缓冲区都有一个生产方(写入该缓冲区)和一个使用方 (即从缓冲区读取数据的人员)。此外,每个环形缓冲区还会与 具有用于为缓冲区时间的参考时钟。
PCM 数据
PCM 音频的环形缓冲区是一个可能无限序列的窗口
帧数。每个帧都分配有一个“帧号”其中第一帧是
无限序列的编号为 0。帧 X
可以在环形缓冲区中找到
偏移 (X % RingBufferFrames) * BytesPerFrame
,其中 RingBufferFrames
为
环形缓冲区的大小(以帧为单位),BytesPerFrame
是
单个帧。
并发协议
每个环形缓冲区都有一个生产方和一个消费方, 按时间同步。根据环形缓冲区的 参考时钟,我们定义了两个函数:
-
SafeWritePos(T)
是生成方最小(最早)的帧号 允许写入。生产方可以向此帧或任意 编号较大的帧。 -
SafeReadPos(T)
是使用方拥有的最高(最年轻)帧号 被允许读取。使用方可以读取此帧或任何较低编号的帧 帧。
为避免冲突,我们将这些属性定义为按 1 偏移:
SafeWritePos(T) = SafeReadPos(T) + 1
为避免竞选,必须有一个生产方,但可能有多个生产方 。此外,由于生产方和使用方是同步的, 随着时间的到来,我们需要显式围栏以确保缓存一致性: 生产者必须在每次写入后插入适当的栅栏(以刷新 CPU) 缓存并防止编译器对存储进行重新排序),且使用方必须 在每次读取之前插入一个适当的围栏(使 CPU 缓存失效并 防止编译器对加载进行重新排序)。
由于缓冲区大小有限,因此生产方/使用方无法执行写入/读取操作
无限未来/过去。我们为提供方分配P
帧
C
帧发送给使用方,其中 P + C <= RingBufferFrames
和 P
以及
C
均由创建环形缓冲区的人员选择。
决定 P
和 C
在实践中,生产者/使用者通常会写入/读取批量帧
。例如,提供方可能每 Dp
唤醒一次
写入 DpFrameRate
帧的毫秒数,其中 FrameRate
是 PCM
视频流的帧速率如果提供方在时间 T 醒来,该提供方将最多花费
写入这些帧后的 Dp
个时间段。这意味着,它所需的最小帧数
SafeWritePos(T+Dp)
,相当于
SafeWritePos(T) + Dp
FrameRate
。提供方写入 DpFrameRate
帧
从这个位置开始整个地区(SafeWritePos(T)
)
直到 2
DpFrameRate
才会在时间 T 分配给提供方。制作
一个类似的参数,我们得出了以下限制:
P >= 2
因此,实际上,P
和 C
可以根据
生产者和使用方,其中最大批量大小受
环形缓冲区空间。
定义 SafeWritePos
SafeWritePos
(以及隐式 SafeReadPos
)的定义必须为
带外提供。
非 PCM 数据
非 PCM 数据的处理方式与 PCM 数据类似,不同之处在于位置 以“字节偏移量”表示而不是“帧号”,也就是 序列从字节偏移量 0 开始。
Ordinal | 字段 | 类型 | 说明 |
---|---|---|---|
1 |
buffer |
fuchsia.mem/Buffer
|
实际环形缓冲区。 必填。 |
2 |
format |
Format
|
缓冲区中音频数据的编码。 必填。 |
3 |
producer_bytes |
uint64
|
分配给生产方的字节数。 对于 PCM 编码, 对于非 PCM 编码,没有任何限制,但单独的编码 可能会有更严格的要求。 必填。 |
4 |
consumer_bytes |
uint64
|
分配给使用方的字节数。 对于 PCM 编码, 对于非 PCM 编码,没有任何限制,但单独的编码 可能会有更严格的要求。 必填。 |
5 |
reference_clock |
handle<clock>
|
环形缓冲区的参考时钟。 必填。 |
6 |
reference_clock_domain |
uint32
|
可选。如果未指定,则默认为 |
StreamSinkOnWillCloseRequest
在 fuchsia.audio/stream_sink.fidl 中定义
Ordinal | 字段 | 类型 | 说明 |
---|---|---|---|
1 |
reason |
fuchsia.media2/ConsumerClosedReason
|
连接关闭的原因。 |
StreamSinkPutPacketRequest 资源
在 fuchsia.audio/stream_sink.fidl 中定义
Ordinal | 字段 | 类型 | 说明 |
---|---|---|---|
1 |
packet |
Packet
|
描述数据包。必须填写此字段。 |
2 |
release_fence |
handle<eventpair>
|
在使用方完成数据包和缓冲区区域后关闭的事件对
可以重复使用数据包可按任意顺序释放。通过
释放栅栏可能会被该服务复制,因此必须在发送
|
StreamSinkStartSegmentRequest
在 fuchsia.audio/stream_sink.fidl 中定义
Ordinal | 字段 | 类型 | 说明 |
---|---|---|---|
1 |
segment_id |
int64
|
标识细分。指定连接的新细分 ID 必须始终严格 不断增加。必须填写此字段。 |
StreamSinkWillCloseRequest
在 fuchsia.audio/stream_sink.fidl 中定义
Ordinal | 字段 | 类型 | 说明 |
---|---|---|---|
1 |
reason |
fuchsia.media2/ProducerClosedReason
|
连接关闭的原因。 |
联合体
ChannelLayout 柔性环境
在 fuchsia.audio/format.fidl 中定义
表示音频基本流中声道的预期分配。
Ordinal | 变体 | 类型 | 说明 |
---|---|---|---|
1 |
config |
ChannelConfig
|
此值用于说明每个渠道的分配情况。频道
配置必须符合 |
GainControl_SetGain_Result 严格
在 fuchsia.audio/gain.fidl 中定义
Ordinal | 变体 | 类型 | 说明 |
---|---|---|---|
1 |
response |
GainControl_SetGain_Response
|
|
2 |
err |
GainError
|
GainControl_SetMute_Result strict
在 fuchsia.audio/gain.fidl 中定义
Ordinal | 变体 | 类型 | 说明 |
---|---|---|---|
1 |
response |
GainControl_SetMute_Response
|
|
2 |
err |
GainError
|
GainUpdateMethod flexible
在 fuchsia.audio/gain.fidl 中定义
支持的增益更新类型。
Ordinal | 变体 | 类型 | 说明 |
---|---|---|---|
1 |
gain_db |
float32
|
立即将增益设置为此值。 |
2 |
ramped |
RampedGain
|
使用斜坡逐步改变增益。 |
RampFunction 柔性
在 fuchsia.audio/gain.fidl 中定义
支持的梯度函数类型。
Ordinal | 变体 | 类型 | 说明 |
---|---|---|---|
1 |
linear_slope |
RampFunctionLinearSlope
|
时间戳柔性环境
在 fuchsia.audio/stream_sink.fidl 中定义
指示音频数据包在流时间轴中的位置。
Ordinal | 变体 | 类型 | 说明 |
---|---|---|---|
1 |
specified |
int64
|
直播时间轴中的特定时间。单位会有所不同,并且会在连接时提供 。 |
2 |
unspecified_continuous |
UnspecifiedContinuous
|
表示数据包应紧跟在上一个数据包之后显示(如果有)
先前的数据包如果没有上一个数据包,则此选项等同于
此选项表示,即使数据包 晚点抵达。该数据包应紧跟在上一个数据包之后显示。 并且所得时间将保持不变,而不考虑数据包的到达时间。 |
3 |
unspecified_best_effort |
UnspecifiedBestEffort
|
表示数据包应在上一个数据包之后尽快呈现(如果 如果有,会尽快解决 此选项表示,如果数据包到达时间过晚,流式传输时间应“滑倒” 并且紧跟在上一个数据包之后呈现如果间隔 发生在无时间戳的流中,可能是由于上游源有损的。 |
位
PacketFlags 柔性环境
类型:uint32
在 fuchsia.audio/stream_sink.fidl 中定义
描述数据包的标志。
名称 | 值 | 说明 |
---|---|---|
DROP_AFTER_DECODE |
1 | 表示仅提供此数据包,以便之后的数据包可供解释。答 解码器应丢弃由该数据包生成的解压缩包。 |
常量
名称 | 值 | 类型 | 说明 |
---|---|---|---|
MAX_COMPRESSION_PARAMETERS_SIZE |
32768
|
uint64 |
|