Android 通过AudioTrack播放CAF音频

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.media.MediaPlayer;
import android.media.AudioManager;
import android.media.AudioTrack;
import android.media.AudioFormat;

public class LRChannel extends Activity {
    private Button lButton;
    private Button rButton;
    private TextView myTextView;
    private MediaPlayer mMediaPlayer01 = null;
    private AudioTrack aAudioTrack01 = null;
    private String strFilePath = "/sdcard/test.caf";
    private float midVol = 0;
   
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        lButton = (Button) findViewById(R.id.ButtonL);
        rButton = (Button) findViewById(R.id.ButtonR);
        myTextView = (TextView) findViewById(R.id.myTextView);
        
        // left button response
        lButton.setOnClickListener(new Button.OnClickListener()
        {
          @Override
          public void onClick(View arg0)
          {
                playSound(strFilePath, 0);

          }
        });
        
        // right button response
        rButton.setOnClickListener(new Button.OnClickListener()
        {
          @Override
          public void onClick(View arg0)
          {
              playSound(strFilePath, 1);
          }
        });
    }
   
    // iChannel = 0 means left channel test, iChannel = 1 means right channel test.
    private void playSound(String strPath, int iChannel)
    {
      // If now is playing...
      if ( aAudioTrack01 != null )
      {
          aAudioTrack01.release();
          aAudioTrack01 = null;
      }
      // Get the AudioTrack minimum buffer size
      int iMinBufSize = AudioTrack.getMinBufferSize(44100,
                          AudioFormat.CHANNEL_CONFIGURATION_STEREO,
                          AudioFormat.ENCODING_PCM_16BIT);
      if ( iMinBufSize == AudioTrack.ERROR_BAD_VALUE || iMinBufSize == AudioTrack.ERROR )
      {
          return;
      }
      // Constructor a AudioTrack object
      try
      {
          aAudioTrack01 = new AudioTrack(AudioManager.STREAM_MUSIC, 44100,
                    AudioFormat.CHANNEL_CONFIGURATION_STEREO,
                    AudioFormat.ENCODING_PCM_16BIT,
                    iMinBufSize,
                    AudioTrack.MODE_STREAM);
      }
      catch (IllegalArgumentException iae)
      {
          myTextView.setText("new AudioTrack Exceeption:" + iae.toString());
          iae.printStackTrace();
      }
      // Write data to buffer
      byte data[] = new byte[iMinBufSize];
      aAudioTrack01.write(data, 0, data.length);
      aAudioTrack01.write(data, 0, data.length);
      float lValue = 0;
      float rValue = 0;
      
      if ( iChannel == 0 )
      {
          lValue = 1.0f;
          rValue = 0.0f;
      }
      else if ( iChannel == 1 )
      {
          lValue = 0.0f;
          rValue = 1.0f;
      }
      
      aAudioTrack01.play();
      if ( aAudioTrack01.setStereoVolume(lValue, rValue) == AudioTrack.SUCCESS )
      {
          myTextView.setText("setStereoVolume successfully!");
      }
      aAudioTrack01.stop();
      if ( aAudioTrack01.setStereoVolume(midVol, midVol) == AudioTrack.SUCCESS )
      {
          myTextView.setText("Restore setStereoVolume successfully!");
      }
      aAudioTrack01.release();
      aAudioTrack01 = null;
    }
   
    @Override
    protected void onDestroy() {
        super.onDestroy();
        // TODO Auto-generated method stub
        if ( aAudioTrack01 != null ) {
            aAudioTrack01.setStereoVolume(midVol, midVol);
            aAudioTrack01.release();
            aAudioTrack01 = null;
        }
    }
   
}


        /**
         * Play the sound by AudioTrack.
         * 
         * @param soundData
         *            The sound which is to be played.
         */
        private void playSound(byte[] soundData) {
            int index = 0;
            int offset = 0;
            // 8000 byte every second
            final int minBufsize = AudioTrack.getMinBufferSize(8000,
                    AudioFormat.CHANNEL_OUT_STEREO,// The channel
                    AudioFormat.ENCODING_PCM_16BIT);

            mAudioTrack = new AudioTrack(AudioManager.STREAM_MUSIC,
                    8000,
                    AudioFormat.CHANNEL_OUT_STEREO,
                    AudioFormat.ENCODING_PCM_16BIT,
                    minBufsize,
                    AudioTrack.MODE_STREAM);

            mAudioTrack.play();
            while (true) {
                try {
                    offset = index * minBufsize;
                    if (offset >= soundData.length) {
                        break;
                    }

                    publishProgress(offset);
                    mAudioTrack.write(soundData, offset, minBufsize);
                } catch (Exception e) {
                    break;
                }

                index++;
            }

            mAudioTrack.release();
        }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值