为了账号安全,请及时绑定邮箱和手机立即绑定

AudioTrack 信号发生器监听陀螺仪

AudioTrack 信号发生器监听陀螺仪

元芳怎么了 2022-07-27 21:40:49
我正在尝试创建信号发生器,其频率由陀螺仪传感器数据控制(通过移动手机)。问题是,我正在调用AudioTrack内部onSensorChanged并且我在输出上有“点击”,因为每次更新传感器时,我都会调用stopSinus();setSinus(Frequency);startSinus();它是这样定义的 siAudioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, SAMPLE_RATE, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT, buffsize, AudioTrack.MODE_STATIC);public void stopSinus() {        int checkPlay = siAudioTrack.getPlayState();        if (checkPlay == 3) {  //         siaudioTrack.stop();         }}public void startSinus() {        siAudioTrack.reloadStaticData();        siAudioTrack.setLoopPoints(0, sampleCount, -1);          siAudioTrack.play();}public void setSinus(int frequency) {    sampleCount = (int) ((float) SAMPLE_RATE / frequency);    short sample[] = new short[sampleCount];    int amplitude = 32767;    double twoPi = 2 * Math.PI;;    double phase = 0.0;    for (int i = 0; i < sampleCount; i++) {        sample[i] = (short) (amplitude * Math.sin(phase));        phase += twoPi * frequency / SAMPLE_RATE;    }    siAudioTrack.write(sample, 0, sampleCount);}onSensorChanged每秒变化几次,它会在波浪中间停止发电机 - 这就是“点击”的来源。有人能告诉我如何在一整波后停止发电机吗?如何找出phaseos何时通过零?或者一些不同的解决方案?
查看完整描述

1 回答

?
红糖糍粑

TA贡献1815条经验 获得超6个赞

没有实用的方法来确定应用于扬声器的相位何时超过 0。最好放弃这一点。

这是一个“不同”的解决方案,我认为您会发现效果更好:

  1. 切换到MODE_STREAM。要获得最低延迟,请使用最小的可用缓冲区大小 ( getMinBufferSize())。

  2. 使用专用线程向AudioTrackAudioTrack该线程有一项工作:根据当前频率将一小段波形写入。(您也可以使用主线程,并不断地AudioTrack使用非阻塞写入,但在我看来,使用单独的线程更优雅。线程将大部分时间卡在阻塞write()调用中,这意味着缓冲区保持不变最大限度地填充,用最少的工作。)

  3. 摆脱startSinus()stopSinus()。从头开始播放音频,直到您离开应用程序才停止。

  4. 进行更改setSinus(),使其简单地将当前频率值传达给步骤 2 中描述的线程。使用任何标准的线程间通信机制。

  5. 当该离开应用程序时,使用标准的线程间通信机制来通知线程它应该终止,然后join()它,清理等。

额外细节:

  • 做你的write()s小。一次可能只有 100 个样本。这有助于最大限度地减少延迟,同时仍保持理想的阻塞行为,并且无需担心AudioTrack.

  • 在工作线程中,使用 afloat来跟踪阶段(就像您现在所做的那样)。根据频率增加相位,但不要让它变得太大!通过让它环绕将其保持在 0 到 2*PI 之间(否则,由于量化,大的相位误差会蔓延,并且频率会意外改变)。phase显然,在填充每个微小的 100 个样本缓冲区后,您不会重置。你只是让它继续滚动。


查看完整回答
反对 回复 2022-07-27
  • 1 回答
  • 0 关注
  • 128 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号