Android N Audio: AudioTrack 介绍

AudioTrack被用于PCM音频流的回放。它的使用方式如下,

 

//buffer

int bufsize =

          AudioTrack.getMinBufferSize(8000,//采样率:

        AudioFormat.CHANNEL_CONFIGURATION_STEREO,//双声道           

        AudioFormat.ENCODING_PCM_16BIT//采样精度);

 

// AudioTrack

AudioTrack trackplayer = new AudioTrack(

                 AudioManager.STREAM_MUSIC,//

                 8000,AudioFormat.CHANNEL_CONFIGURATION_ STEREO,

                   AudioFormat.ENCODING_PCM_16BIT, bufsize,

                 AudioTrack.MODE_STREAM);

  //

trackplayer.play() ;

 

......

//

trackplayer.write(bytes_pkg, 0,bytes_pkg.length) ;/

......

 

 //

trackplayer.stop();

trackplayer.release();

 

 

frameworks\base\media\tests\MediaFrameworkTest\src\com\android\mediaframeworktest\functional\audio也有demo程序MediaAudioTrackTest.java.

 

 

在数据传送上它有两种方式:push和pull,即主动或被动获取数据。

数据播放上,AudioTrack还同时支持static和streaming两种模式,即一次加载完数据还是加载部分数据就可播放。

 

AudioTrack的创建流程如下,

 

部分函数说明如下,

createTrack_l的主要调用关系如下,

 

status_t AudioTrack::createTrack_l()

{

……

    sp<IAudioTrack> track = audioFlinger->createTrack(streamType,

                                                      mSampleRate,

                                                      mFormat,

                                                      mChannelMask,

                                                      &temp,

                                                      &trackFlags,

                                                      mSharedBuffer,

                                                      output,

                                                      mClientPid,

                                                      tid,

                                                      &mSessionId,

                                                      mClientUid,

                                                      &status);

 

    // update proxy

    if (mSharedBuffer == 0) {

        mStaticProxy.clear();

        mProxy = new AudioTrackClientProxy(cblk, buffers, frameCount, mFrameSize);

    } else {

        mStaticProxy = new StaticAudioTrackClientProxy(cblk, buffers, frameCount, mFrameSize);

        mProxy = mStaticProxy;

}

……

}

 

 

 

通过binder到AudioFlinger::createTrack,这里主要完成以下功能,

        PlaybackThread *thread = checkPlaybackThread_l(output);

        track = thread->createTrack_l(client, streamType, sampleRate, format,

                channelMask, frameCount, sharedBuffer, lSessionId, flags, tid, clientUid, &lStatus);//主要是创建一个playback的Track

 

        setAudioHwSyncForSession_l(thread, lSessionId);

 

    // return handle to client

    trackHandle = new TrackHandle(track); //作为IAudioTack的server端,提供接口给AT,并在AF内做功能桥接

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值