亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 126 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號