Duvida sobre AudioTrack (emissão de Frequências sonoras)

16/03/2018

0

Boa tarde, estou tentando criar um emissor de frequências sonoras audíveis pelo ser humano, desafio de um professor, mas não consigo fazer o som ficar continuo ao clicar no seekBar e ser parado ao clicar no botão stop, ou mudar de frequência ao mover o SeekBar, alguém poderia me ajudar? segue o código que estou utilizando.

public class MainActivity extends AppCompatActivity {

    Button Play,Stop;
    Boolean recording = false;
    TextView freque;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);




        freque = (TextView) findViewById(R.id.txtfreq);
        SeekBar Frequencia = (SeekBar) findViewById(R.id.seekFreq);


        Play = (Button)findViewById(R.id.Play);
        Stop = (Button)findViewById(R.id.Stop);


        Play.setOnClickListener(PlayOnClickListener);
        Stop.setOnClickListener(StopOnClickListener);

        Frequencia.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar seekBar, int i, boolean b) {

                freque.setText("Frequencia: " + i);

                while(recording){

                playSound(i,44100);

                }

            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {

            }

            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {

            }

        });
    }



    View.OnClickListener PlayOnClickListener
            = new View.OnClickListener(){

        @Override
        public void onClick(View arg0) {

            Thread recordThread = new Thread(new Runnable(){

                @Override
                public void run() {
                    recording = true;

                    }

            });

            recordThread.start();

        }};

    View.OnClickListener StopOnClickListener
            = new View.OnClickListener(){
        @Override
        public void onClick(View arg0) {
            recording = false;

        }};


    private void playSound(double frequency, int duration) {
        // AudioTrack definition

        if (recording == true){
        int mBufferSize = AudioTrack.getMinBufferSize(44100,
                AudioFormat.CHANNEL_OUT_MONO,
                AudioFormat.ENCODING_PCM_8BIT);

        final AudioTrack mAudioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, 44100,
                AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT,
                mBufferSize, AudioTrack.MODE_STREAM);

        // Sine wave
        final double[] mSound = new double[4410];
        final short[] mBuffer = new short[duration];
        for (int i = 0; i < mSound.length; i++) {
            mSound[i] = Math.sin((2.0*Math.PI * i/(44100/frequency)));
            mBuffer[i] = (short) (mSound[i]*Short.MAX_VALUE);
        }



        mAudioTrack.setStereoVolume(AudioTrack.getMaxVolume(), AudioTrack.getMaxVolume());
        mAudioTrack.play();

        mAudioTrack.write(mBuffer, 0, mSound.length);
        mAudioTrack.stop();
        mAudioTrack.release();
    }}


}
Anatan

Anatan

Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar