Трещины в Android AudioTrack - PullRequest
       50

Трещины в Android AudioTrack

0 голосов
/ 08 марта 2019

Я использую образец приложения, который использует X и Y касания, равный X по частоте и Y по амплитуде. Затем вычисляем простую греховную волну и пропускаем этот поток. Когда я генерирую звуковой сигнал - между записью новых данных репродуктор издает треск.

Я никогда раньше не работал со звуком, но могу предположить, что трещины - это скачок значения в синусоиде, но почему его трещина в конце трека, когда его гарантия будет равной нулю? вот почему мне нужна помощь. В начале и конце звуковой дорожки слышен треск.

audioTrack создается в методе onCreate. Метод start () запустит audioTrack.

audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC,
            sampleRate,
            AudioFormat.CHANNEL_OUT_MONO,
            AudioFormat.ENCODING_PCM_16BIT, numSamples,
            AudioTrack.MODE_STREAM);
    start();

Это моя тема:

Runnable m_noiseGenerator = new Runnable() {
    public void run()
    {
        Thread.currentThread().setPriority(Thread.MIN_PRIORITY);

        while(!m_stop)
        {
            //rnd.nextBytes(noiseData);

            try {
                if(playing) {
                    //audioTrack.flush();
                    long startTime = System.currentTimeMillis();
                    audioTrack.write(generatedSnd, 0, generatedSnd.length);
                    if (audioTrack.getPlayState() == audioTrack.PLAYSTATE_STOPPED)
                        audioTrack.play();
                    long finish = System.currentTimeMillis() - startTime;
                    System.out.print("\naudioTrackThread: WRITTEN IN " + finish + "ms\n");
                    genToneUpdate = false;
                }
            } catch (Exception ex) {
                System.out.print("THREAD ERROR " + ex);
            }

            try {
                //Thread.sleep(50);
                //Thread.sleep(1000);
            } catch (Exception ex) {
                System.out.print("THREAD ERROR sleep " + ex);
            }
        }
    }
};

Вот как я вычисляю и редактирую данные

for (int i = 0; i < numSamples; i++) {
         samples[i] = ((double) amp / 100) * Math.sin(2 * Math.PI * i * (freq/sampleRate));
        }
        int idx = 0;
        for (final double dVal : sample) {
            // scale to maximum amplitude
            final short val = (short) ((dVal * 32767));
            // in 16 bit wav PCM, first byte is the low order byte
            generatedSnd[idx++] = (byte) (val & 0x00ff);
            generatedSnd[idx++] = (byte) ((val & 0xff00) >>> 8);
            genToneUpdate = true;
        }

Целое приложение доступно здесь: приложение SoundGenerator

...