Broadcom Nexus学习 (三) Audio Decoder

来源:互联网 发布:tf idf算法python实现 编辑:程序博客网 时间:2024/05/17 02:56

先前介绍了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 MixerMixer将多路信号合并起来,送入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

AudioDecoderpidChannel 则设置为刚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));

0 0