先前介绍了Graphics以及AudioPlayback方面的概念,今天介绍AudioDecoder.
先从Interface层面看看AudioDecoder思路:
要播放本地文件(例如:本地MP3文件),需要的Interface互联路径如下:
Audio源可以是同轴电缆传出的有线电视信号,也可以是本地文件(通过playpump),传入Pid Channel,之后传到Audio Decoder, 到Audio Mixer, 然后进入Audio DAC 播放出来。
Sam的感觉是:Pid Channel就像一条路,把输入和解码器(Audio Decoder)联系起来。 Audio Decoder解码后,则将未加密的数字信息传送给Audio Mixer, Mixer将多路信号合并起来,送入Audio DAC去播放出来。
此处的InputBand,Sam理解为有线电视信号,ParserBand则为解码器,将信号解出来。
信号分别进入了Video Pid Channel和Audio Pid Channel. 并最终输出。
现在先看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);
playbackSettings.playpump = playpump; //将PlayPump和Playback联系起来了。
playbackSettings.playpumpSettings.transportType = NEXUS_TransportType_eEs;
playbackSettings.endOfStreamCallback.callback = eof;
playbackSettings.endOfStreamCallback.context = event;
playbackSettings.enableStreamProcessing = true;
NEXUS_Playback_SetSettings(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(
NEXUS_AudioDac_GetConnector(platformConfig.outputs.audioDacs[0]),
NEXUS_AudioDecoder_GetConnector(pcmDecoder,
NEXUS_AudioDecoderConnectorType_eStereo));
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.播放完成后:
NEXUS_AudioDecoder_Stop(pcmDecoder); //停止AudioDecoder
NEXUS_Playback_Stop(playback); //停止Playback
NEXUS_AudioOutput_RemoveAllInputs(NEXUS_AudioDac_GetConnector(platformConfig.outputs.audioDacs[0])); //Audio Dac断连接。
NEXUS_Playback_ClosePidChannel(playback, audioProgram.pidChannel); //Playback关闭PidChannel
NEXUS_Playback_Destroy(playback); //PlayBack销毁自己
NEXUS_Playpump_Close(playpump); //PlayPump关闭
NEXUS_AudioInput_Shutdown(NEXUS_AudioDecoder_GetConnector(pcmDecoder, NEXUS_AudioDecoderConnectorType_eStereo));
NEXUS_AudioDecoder_Close(pcmDecoder);
NEXUS_FilePlay_Close(file);
另外,如果想将AudioDecoder连接到Auido Mixer,则与之前的AudioPlayback连到Audio Mixer一样:
NEXUS_AudioMixer_AddInput(gMixer, NEXUS_AudioDecoder_GetConnector(gPCMDecoder, NEXUS_AudioDecoderConnectorType_eStereo));