无法在Audiotrack对象上暂停:android

时间:2012-10-15 18:18:32

标签: android multithreading audiotrack

在我的应用程序中,我已经成功录制了音频,现在我正在使用以下功能播放它:

    public void playfile()
{
    System.out.println("Play Pressed");     
     speechLength = (int)(file.length()/2);
     speech2 = new short[speechLength];
     try
     {
        // Create a DataInputStream to read the audio data back from the saved file.
        InputStream is = new FileInputStream(file);
        BufferedInputStream bis = new BufferedInputStream(is);
        DataInputStream dis = new DataInputStream(bis);

        int i = 0;              
        while(i <  speechLength)
        {
            speech2[i] = dis.readShort();
            i++;
        }

        // Close the input streams.
        is.close();
        bis.close();
        dis.close();  

        // Create a new AudioTrack object using the same parameters as the AudioRecord
        // object used to create the file.
        audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC,
                16000, 
                AudioFormat.CHANNEL_OUT_MONO,
                AudioFormat.ENCODING_PCM_16BIT, 
                bufferSizeAT, 
                AudioTrack.MODE_STREAM);   

        //Start playback


        runner.start();
        //Updating Progress Bar on UI Thread
        //updateProgressBar();
     } //main try
    catch (Throwable t){} 
}
 Thread runner= new Thread (){
        public void run()
        {

              // Do stuff.
            audioTrack.play();
            audioTrack.setStereoVolume(50, 50);
            audioTrack.write(speech2, 0, speech2.length);

        }
    };

但是当按下按钮时我想暂停正在播放的录音暂停,但在恢复时没有任何反应。以下是相同的代码:

       final Button p3_button=(Button)myView.findViewById(R.id.btn_play);
    p3_button.setOnClickListener(new View.OnClickListener()
    {
        @Override
        public void onClick(View view)
        {       
            if(p3_button.getText().equals("Pause"))
            {

                p3_button.setText("Resume");
                audioTrack.pause();


            }
            else if(p3_button.getText().equals("Resume"))
            {
                p3_button.setText("Pause");

                audioTrack.play();


            }
            else
            {
                p3_button.setText("Pause");
                count = 0;
                isPlayPressed = true;
                playing = true;
                playfile();
            }
        }});

任何帮助都会很棒。谷歌上没有太多帮助。我几乎完成了我的应用程序,但现在在最后一刻,我正在遭受这个问题。请帮助我!!

2 个答案:

答案 0 :(得分:2)

您无法使用==

比较字符串

p3_button.getText()=="Pause"这样的行更改为p3_button.getText().equals("Pause")

尝试解决问题。

答案 1 :(得分:1)

我发现问题是track.write是阻塞的。这是一个似乎现在可以工作的WavTrack类:

package org.this_voice.zhongguomozhou;


import android.content.Context;
import android.media.AudioFormat;
import android.media.AudioManager;
import android.media.AudioTrack;
import android.os.Environment;
import java.io.InputStream;
import java.io.IOException;
import java.lang.Thread;

public class WavTrack {
/**
Make sure you set the sample rate, stereo/mono and encoding
correctly for your audio files.
**/

public static final boolean STOPPED = true;
public AudioTrack at;
public Context mContext;
public int minBufferSize;
public byte[] music = null;
public int size = 0;
public int position = 0;
public InputStream is;
public boolean paused = false;

public WavTrack(Context context) {
    mContext = context;
    minBufferSize = AudioTrack.getMinBufferSize(16000,
        AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT);
    at = new AudioTrack(AudioManager.STREAM_MUSIC, 16000,
        AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT,
        minBufferSize, AudioTrack.MODE_STREAM);
    is = mContext.getResources().openRawResource(R.raw.test01);

    try{
        size = (int)is.available();
    } catch (IOException e) {
        e.printStackTrace();
    }

    at.play();

    new Thread (new Runnable(){
        public void run() {
            int i = 0;
            try{
                music = new byte[512];
                while(((i = is.read(music)) != -1) && !paused){
                    at.write(music, 0, i);
                    position += i;
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }).start();
}


public void pause(){
    is.mark(position);
    paused = true;
    at.pause();
}

public void stop(){
    at.stop();
    at.release();
}

public void play() {
    paused = false;
    try {
        is.reset();
    } catch (IOException e) {
        e.printStackTrace();
    }
    at.play();

    new Thread (new Runnable(){
        public void run() {
            int i = 0;
            try{
                music = new byte[512];
                while(((i = is.read(music)) != -1) && !paused){
                    at.write(music, 0, i);
                    position += i;
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }).start();
}
}