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_minnebo144rá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- na288Vzorky; 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