首页 > 解决方案 > Android:对如何获取 AudioTrack 生成和播放的频率幅度感到困惑

问题描述

在我的应用程序中,我为左右声道生成具有不同频率的声音列表,例如 1000Hz、2000Hz、4000Hz ...

    private AudioTrack generateTone(Ear ear) {
    // fill out the array
    int numSamples = SAMPLE_RATE * getDurationInSeconds();
    double[] sample = new double[numSamples];
    byte[] generatedSnd = new byte[2 * numSamples];

    for (int i = 0; i < numSamples; ++i) {
        sample[i] = Math.sin(2 * Math.PI * i / (SAMPLE_RATE / getLatestFreqInHz()));
    }

    // convert to 16 bit pcm sound array
    // assumes the sample buffer is normalised.
    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);
    }

    AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC,
            SAMPLE_RATE, AudioFormat.CHANNEL_OUT_MONO,
            AudioFormat.ENCODING_PCM_16BIT, numSamples,
            AudioTrack.MODE_STATIC);
    audioTrack.write(generatedSnd, 0, generatedSnd.length);

    int channel;
    if (ear == Ear.LEFT) {
        audioTrack.setStereoVolume(1.0f, 0.0f);
    } else if (ear == Ear.RIGHT) {
        audioTrack.setStereoVolume(0.0f, 1.0f);
    }

    return audioTrack;
}

我使用此代码来控制音量:

        audioManager = (AudioManager) context.getApplicationContext().getSystemService(Context.AUDIO_SERVICE);
    MAX_VOLUME = audioManager.getStreamMaxVolume(STREAM_MUSIC);
    MIN_VOLUME = audioManager.getStreamMinVolume(STREAM_MUSIC);
    APP_DEFAULT_VOLUME = (MAX_VOLUME + MIN_VOLUME) /2 ;

    @Override
public void setToAppDefaultVolume() {
    Timber.tag(TAG).d("Resetting to app default sound volume.");
    audioManager.setStreamVolume(STREAM_MUSIC, APP_DEFAULT_VOLUME, 0);
}

@Override
public void increaseVolume() {
    if (!isReachedMaxVolume()) {
        Timber.tag(TAG).d("Increasing device sound volume from %d to %d", currentVolumeLevel(), currentVolumeLevel() + STEP);
        audioManager.setStreamVolume(STREAM_MUSIC, currentVolumeLevel() + STEP, 0);
    } else {
        Timber.tag(TAG).d("Reached the maximum device volume.");
    }
}

@Override
public void decreaseVolume() {
    if (!isReachedMinVolume()) {
        Timber.tag(TAG).d("Decreasing device sound volume from %d to %d", currentVolumeLevel(), currentVolumeLevel() - STEP);
        audioManager.setStreamVolume(STREAM_MUSIC, currentVolumeLevel() - STEP, 0);
    } else {
        Timber.tag(TAG).d("Reached the preferred minimum volume");
    }

}

我开始使用 APP_DEFAULT_VOLUME 播放每个音调(频率)并逐渐增加音调。当用户确认他/她听到特定音量的特定音调时,我想计算它的幅度并将其记录下来以便我可以查看用户的听力......

但我不知道该怎么做!我找到的所有解决方案都是关于从麦克风读取数据并计算幅度以在屏幕上可视化......我的场景要简单得多。我记录了设备音量,固定频率并记录,音频是动态生成的,不是文件。

有人会帮我解决这种情况吗?

提前致谢。

标签: androidaudioandroid-audiomanageraudiotrack

解决方案


推荐阅读