2012-05-07 113 views
1

我有一個大小爲例如4096的緩衝區,並將數據存儲在其中,如果緩衝區已滿,它將從緩衝區的開始處開始。這似乎是正常工作。Qt - 如何設置音頻播放從緩衝區的開始處開始?

但我有從緩衝區播放數據的問題。

QByteArray   m_buffer; 
QBuffer    m_audioOutputIODevice; 
QAudioOutput*  m_audioOutput; 
m_audioOutputIODevice.close(); 
m_audioOutputIODevice.setBuffer(&m_buffer); 
m_audioOutputIODevice.open(QIODevice::ReadOnly); 
m_audioOutput->start(&m_audioOutputIODevice); 

現在我可以從緩衝區播放聲音,但是當它到達緩衝區結束時,播放停止。 我怎麼能改變代碼,所以當它到達緩衝區的末尾時,它將從一開始就開始? 非常感謝您

更新代碼:

connect(m_audioOutput,SIGNAL(stateChanged(QAudio::State)),SLOT(resetPlayBuffer(QAudio::State))); 

    void bufferPlayback::resetPlayBuffer (QAudio::State state) 
{ 
    if (state == QAudio::IdleState) { 
     m_audioOutputIODevice.close(); 
     m_audioOutputIODevice.setBuffer(&m_buffer); 
     m_audioOutputIODevice.open(QIODevice::ReadOnly); 
    } 
} 

回答

1

void stateChanged (QAudio::State state) <〜當玩家改變時的信號。掛鉤到班級中的一個插槽,並在狀態停止時重複播放過程。簡單。我喜歡Qt的原因之一。

+0

我也試過下面的代碼,但失敗了。我認爲這是你提到的方法,也許我犯了一個錯誤?我會更新在quesiton代碼:)更容易閱讀 – Tiina

+0

http://doc-snapshot.qt-project.org/5.0/phonon-gstreamer-audiooutput.html – johnathon

+0

現在我可以繼續錄製和播放音頻,但有每次回放之​​間的差距,因爲QAudioOutput從IdleState恢復 – Tiina

0

AFAICT QAudioOutput沒有任何內置的音頻循環支持,所以我想你會通過發送新的音頻緩衝模擬音頻循環定期到QAudioOutput設備,以便它永遠不會耗盡音頻字節的播放。

我認爲最簡單的方法是編寫你自己的QIODevice的子類,假設它是一個非常長的(無限?)文件,但在查詢時會一遍又一遍地返回循環樣本。然後將QIODevice-subclass-obect作爲參數傳遞給QAudioOutput :: start()。

+0

嗨,我試過這種方法,但我聽不到任何聲音。要深入挖掘。 – Tiina

+0

謝謝,程序現在工作正常:) – Tiina

相關問題