2012-03-12 9 views
6

Ho un dubbio con il seguente frammento di codice ...QAudioInput :: byteReady() e QIODevice :: read() dando diverso numero di byte

const qint64 bytesReady = m_audioInput->bytesReady(); 
const qint64 bytesSpace = m_buffer.size() - m_dataLength; 
const qint64 bytesToRead = qMin(bytesReady, bytesSpace); 
const qint64 bytesRead = m_audioInputIODevice->read(m_buffer.data() + m_dataLength, bytesToRead); 

metodo bytesReady() mi sta dando un particolare numero di byte e sto passando questo numero di byte al read() di QIODevice che mi restituirà il numero di byte letti.

Il problema è che bytesRead non è uguale a bytesToRead. E sto ottenendo il numero fisso di byte dal metodo di lettura i.e 320, 640, 960, 1280, ecc. E questo dipende da byteToRead.

+0

Puoi provare in un ciclo? cioè 'while (bytesReady = m_audioInput-> bytesReady()> 0) {...}' e dire cosa succede? Come hai inizializzato il QAudioFormat in uso? hai fatto in modo che 'QAudioDeviceInfo :: isFormatSupported()' restituisse true ?? – UmNyobe

+0

tutto funziona bene il problema è con il frammento di codice di cui sopra ... non in realtà un problema, ma un dubbio perché il mio codice è in esecuzione con successo .. – shofee

+0

rispondere ... – shofee

risposta

7

Non esiste alcuna relazione diretta tra QAudioInput::bytesReady() e QIODevice su cui sta scrivendo i suoi campioni.

QAudioInput mantiene internamente un dispositivo IO (a seconda del sistema) per il sistema audio, che è analogico a uno QIODevice di sola lettura. Quando si chiama bytesReady, restituisce il numero di byte disponibili da leggere, analogico a QIODevice::bytesAvailable(). Quelli hanno non, ma sono stati scritti nell'output QIODevice, quindi quando si esegue lo m_audioInputIODevice->read subito dopo, senza elaborare eventi, si ottengono effettivamente i campioni che sono stati scritti in precedenza, non quelli ancora nel buffer audio.

Questo, oltre al buffering del dispositivo IOD, spiega perché i numeri potrebbero essere diversi e non vedo un modo per sincronizzarli insieme.

In realtà, si dovrebbe fare:

const qint64 bytesRead = m_audioInputIODevice->read(m_buffer.data() + m_dataLength, bytesSpace); 

per ottenere ciò che è disponibile dal IODevice, fino al vostro spazio buffer disponibile.

+0

puoi fornire ulteriori dettagli .... – shofee

+0

Per quanto riguarda l'aspetto? – Koying

+0

riguardo a questo ..."Quando si chiama bytesReady, QAudioInput non ha ancora scritto gli esempi sul dispositivo IOD, quindi quando si esegue il m_audioInputIODevice-> read, si ottengono effettivamente campioni più vecchi." – shofee

2

Meglio ancora:

Usa ->readAll() che restituisce un "QbA"

QByteArray ... quindi utilizzare sz=qba.size() che vi dirà che cosa avete ottenuto (può essere zero)

... poi fare qualcosa con esso utilizzando sz e

... sembra essere senza errori a differenza di gran parte di QAudioInput, che è incredibilmente rotto n, per esempio, il limite arbitrario di frequenza di campionamento di 48000 sotto Windows ma non OSX, la modalità pull usa il thread in primo piano, quindi si interromperà costantemente in qualsiasi situazione reale, bytesReady() non ha significato ... Peggiore. Qt. Routine. EVAR!

Problemi correlati