android - 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 播放每个音调(频率)并逐渐增加音调。当用户确认他/她听到特定音量的特定音调时,我想计算它的幅度并将其记录下来以便我可以查看用户的听力......
但我不知道该怎么做!我找到的所有解决方案都是关于从麦克风读取数据并计算幅度以在屏幕上可视化......我的场景要简单得多。我记录了设备音量,固定频率并记录,音频是动态生成的,不是文件。
有人会帮我解决这种情况吗?
提前致谢。
解决方案
推荐阅读
- multithreading - synchronising lock step execution of threads
- python - 如何在熊猫系列中使用字典和正则表达式转换字符串列值
- javascript - 如何注释 ant design 时间线图中的任何数据点?
- spring - 尝试设置 PSQL 并出现此错误:
- tsql - SQL Server - 与 Group By 一起选择 Raw_Number
- python - Python go.Indicator - 在图中将点更改为逗号
- c# - 使用 Rest API 版本 V50.0 上传到 Salesforce 后文件损坏
- javascript - 如何在 Javascript 中将字符串变量添加到 JSON 查询而不添加额外的转义
- powershell - mawk 脚本适用于 linux,但不适用于 windows
- wit.ai - Wit.ai 获取数字字符而不是纯文本数字