Předpokládám, že tento kód běží v těsné smyčce a je určen k blokování na snd_pcm_writen()
. Vzorkovací frekvence není uvedena; Předpokládám 48 kHz, protože všechna čísla se pěkně dělí.
Myslím, že zde jde o následující:
snd_pcm_write()
nezaručuje zápis všech poskytnutých rámců (vrácená hodnota je vždy kontrolována pouze na chybové stavy). Soudě podle protokolovánísnd_pcm_avail()
ve skutečnosti spotřebováváavail_min
nebo144
rámečky na každém. Toto jsou 3 ms zvuku.- Za předpokladu, že zvuk v tomto okamžiku neběží, po dvou zápisech je počet snímků ve vyrovnávací paměti roven
start_threshold
- na288
Vzorky; spustí se zvukový výstup - volá na
printf()
blok a zdá se, že si pamatujisnd_pcm_avail()
musí se synchronizovat s hardwarem výstupu zvuku a může se také blokovat. Protože jste nyní před přehráváním o 6 ms, je zcela možné, že během třetího volánísnd_pcm_writen()
dojde k vyprázdnění vyrovnávací paměti.
Stručně řečeno, neměli byste volat printf()
v tomto bodě a pravděpodobně budete muset kompenzovat skutečnost, že snd_pcm_writen()
nespotřebovává všechny snímky v pSpeakerBuf