Das reicht aber evtl. auch nicht. Der Parameter für die Anzahl in snd_pcm_readi() gibt _nicht_ die Anzahl der Bytes an sondern die Anzahl der zu lesenden Sample-Frames. Die Größe dieser Frames hängt davon ab, wieviele Kanäle und welchen Datentyp Du für ein Sample bei der Initialisierung der Soundschnittstelle eingestellt hast.
Ein Kanal mit SND_PCM_FORMAT_S16_LE sind z.B. 2 Bytes pro Frame die Du im Puffer zur Verfügung stellen mußt.
Bei zwei Kanälen sind's vier. Dazu ist zu beachten, wenn Du zwei Kanäle hast, wie die Anordnung der Samples ist. Wenn Du SND_PCM_ACCESS_RW_INTERLEAVED in snd_pcm_hw_params_set_access() angegeben hast, musst Du
Code:
snd_pcm_readi(hndl, buf, 4);
aufrufen. _readi() weil interleaved (es gibt noch_readn() für non interleaved) und dann bedeutes das, das wenn du _S16_LE, 2 Kanäle angegeben hast, das der Puffer 2 * 4 * sizeof(int16_t) groß sein muß (Anzahl der Kanäle * Anz.d. Frames * Sample-Größe). Sonst schäpperts.
Die Samples für den ersten Kanal liegen dann in buf[0,2,4,6] und für den zweiten Kanal in buf[1,3,5,7].
Lesezeichen