0

私は簡単な生産者/消費者の例を開発しています。1つのスレッドは、クラスを使用してオーディオサンプルを記録しAudioRecord、それらをバッファに書き込みます。2つ目は、バッファを読み取るだけで何もしません。ユーザーが記録を停止したい場合、最初のスレッドは特殊文字をバッファーに書き込み、他のスレッドは読み取りが終了したことを示します。これが私のコードです

public class SpellCollectorActivity extends Activity implements OnClickListener{
  private ArrayBlockingQueue<byte[] > audioq;
  boolean needToBeStopped = false; 
  Button generate, action;

  private MyRecorder  rec;
  private MyReader mr;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    action = (Button) findViewById(R.id.actionButton);
    action.setOnClickListener(this);

    needToBeStopped = false;
    audioq = new ArrayBlockingQueue<byte[]>(CAPACITY);
}

public void onClick(View arg0){
    switch(arg0.getId()){
    case R.id.generateButton:
        generateContentToSpell();
        break;
    case R.id.actionButton:
        if(needToBeStopped){
            rec.stopThread();
            needToBeStopped = false;
            action.setText(this.getString(R.string.start));
        }else{
            rec = new MyRecorder(audioq);
            mr = new MyReader(audioq);
            rec.start();
            mr.start();
            needToBeStopped = true;
            action.setText(this.getString(R.string.stop));
        }
        break;
    }
}

  private class MyRecorder extends Thread{  
    private static final int freq = 22050;
    private static final int  channelConfiguration =    AudioFormat.CHANNEL_CONFIGURATION_MONO;
    private static final int audioEncoding = AudioFormat.ENCODING_PCM_16BIT;

    private final BlockingQueue<byte[] > myRecAudioq;
    private AudioRecord recorder;
    private boolean recording = false;
    int bufferSize;

    /*konstruktor*/
    public MyRecorder(BlockingQueue<byte[]> q ){
        bufferSize =  AudioRecord.getMinBufferSize(freq, channelConfiguration, audioEncoding);
        myRecAudioq = q;
    }

    public void run(){
        recorder = new AudioRecord(MediaRecorder.AudioSource.MIC, 
                   freq, channelConfiguration, 
                   audioEncoding, 3*bufferSize);
        recorder.startRecording();
        recording = true;
        byte[] buffer = new byte[bufferSize];
        while(recording){
            int readBufferSize = recorder.read(buffer, 0, bufferSize);
            if(readBufferSize>0){
                try {
                    myRecAudioq.put(buffer);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    }

    public void stopThread(){
        recorder.stop();
        recording = false;
        byte[] buffer = new byte[bufferSize];
        for(int i=0;i<bufferSize;i++){
            buffer[i] =(byte) 0xff;
        }
        try {
            myRecAudioq.put(buffer);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

   private class MyReader extends Thread{
    private final BlockingQueue<byte[]> bq;

    private static final int freq = 22050;
    private static final int  channelConfiguration = AudioFormat.CHANNEL_CONFIGURATION_MONO;
    private static final int audioEncoding = AudioFormat.ENCODING_PCM_16BIT;

    private int counter = 0;

    public MyReader(BlockingQueue<byte[]> q){
        bq = q;
    }
    public void run(){
        int buffSize =  AudioRecord.getMinBufferSize(freq, channelConfiguration, audioEncoding);
        byte[] compareBuffer= new byte[buffSize];
        for(int i=0;i<buffSize;i++){
            compareBuffer[i] = (byte)0xff;
        }

        boolean reading = true;
        byte[] buffer = null;
        do{
            try {
                buffer = bq.take();
   reading = buffer.equals(compareBuffer);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            if(reading){
                int c=1;
            }
        }while(!reading);
        int a=5;
    }
  } 
 }

MyReaderクラスの行 にブレークポイントを設定しようとしましたが、int c=1; 到達しませんでした。この例を使用してこのコードを作成しました。何が問題なのですか?

4

1 に答える 1

0

'reading' の値は、2 バイト [] 間の比較です。

これは、両方が同じオブジェクト (場合によってはポインター) である場合、つまり、最初に呼び出した場合にのみ当てはまります。buffer = compareBuffer

実際にやりたいことは、たとえばjava.util.Arraysclass を使用して、バッファのすべての要素を比較することです:

reading = Arrays.equals(compareBuffer, buffer);
于 2012-09-04T10:11:14.027 に答える