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,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() - STEP);
        audioManager.setStreamVolume(STREAM_MUSIC,currentVolumeLevel() - STEP,0);
    } else {
        Timber.tag(TAG).d("Reached the preferred minimum volume");
    }

}

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

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

有人会帮我解决这个问题吗?

提前致谢。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...