先前介绍了Graphics以及AudioPlayback方面的概念,今天介绍AudioDecoder.
先从Interface层面看看AudioDecoder思路:
要播放本地文件(例如:本地MP3文件),需要的Interface互联路径如下:
Sam的感觉是:Pid Channel就像一条路,把输入和解码器(Audio Decoder)联系起来。 Audio Decoder解码后,则将未加密的数字信息传送给Audio Mixer, Mixer将多路信号合并起来,送入Audio DAC去播放出来。
现在先看AudioDecoder具体实现:
1. NEXUS_Playpump_Open()
open一个新的PlayPump Interface。
Sam理解PlayPump就是一个本地播放源。否则Pid Channel就只能用数字电视信号源来作为Audio输入了。
2. NEXUS_Playback_Create()
创建一个PlayBack实例。请注意,上图Interface中并未包含Playback。
NEXUS_Playback_GetSettings(playback, &playbackSettings);
3. NEXUS_FilePlay_OpenPosix()
打开指定文件(音频文件)
4.NEXUS_AudioDecoder_Open()
打开一个Audio Decoder。可以认为它就是一个解码器。可以设置送给它的数据格式是什么。
5. NEXUS_Playback_OpenPidChannel(playback, 1, &pidSettings)
之前建立的Playback(参数1) 实例打开了一个Pid channel. 此Pid Channel的设置如下:
pidSettings.pidSettings.pidType = NEXUS_PidType_eAudio;
pidSettings.pidSettings.pidTypeSettings.audio.codec = NEXUS_AudioCodec_eMp3;
pidSettings.pidTypeSettings.audio.primary = pcmDecoder;
也就是说:此Pid Channel是个Audio Pid Channel. 送出的Audio Data是MP3格式,同时,送给的Decoder是上面步骤4所建立的AudioDecoder。
6. NEXUS_AudioDecoder_GetDefaultStartSettings(&audioProgram);
设置AudioDecoder,
audioProgram.codec = NEXUS_AudioCodec_eMp3;
audioProgram.pidChannel = 步骤5建立的Pid Channel Handle。
注意: 此时Pid Channnel的pidTypeSettings.audio.primary设置为 AudioDecoder。
AudioDecoder的pidChannel 则设置为刚Open 的PidChannel。有点像双向联表。
7. NEXUS_AudioOutput_AddInput(
Audio DAC 与 AudioDecoder连接起来。
此时,从MP3 文件 到playpump,到pid channel, 到AudioDecoder,到AudioDac的路全通了。
8.
NEXUS_Playback_Start(playback, file, &playbackStartSettings);
NEXUS_AudioDecoder_Start(pcmDecoder, &audioProgram);
Playback开始播放,参数2为数据文件。
AudioDecoder开始解码。
9.播放完成后:
另外,如果想将AudioDecoder连接到Auido Mixer,则与之前的AudioPlayback连到Audio Mixer一样:
NEXUS_AudioMixer_AddInput(gMixer, NEXUS_AudioDecoder_GetConnector(gPCMDecoder, NEXUS_AudioDecoderConnectorTyp