Na podstawie artykulu http://www.linuxjournal.com/article/6735 wykorzystuje ALSA-e do nagrywania dzwieku, ktore nastepnie bede chcial wykorzystac w swoim programie. Jednak nie rozumiem jednej rzeczy - jesli ktos bylby tak mily i to wytlumaczyl to bedzie super.
Oto w programi numer 4, ktory sluzy wlasnie do nagrywania dzwieku, jest taka kluczowa petla while, ktora odczytuje bufor karty dzwiekowej. Poniewaz czas nagrywania wynosi 5 sekund z czestoliwoscia 44100Hz to ilosc dzialania tej petli wynosi okolo 113 razy. Wynika to z: loops = 5'000'000 / 44100.
Tylko moje pytanie brzmi - co takiego sprawia ze dla kazdego komputera te 113 razy to bedzie 5 sekund. Gdzie w przykladowym programie jest jakis delay, czyli opoznienie, ktore powoduje ze komputer wywola petle 113 razy, ktore bedzie odpowiadalo 5 sekundom. Przeciez normalnie to nawet najslabszy komputer wywola taka petle w 10 mikrosekund i juz. A tu jest cos, co kaze mu czekac do tych 5 sekund. Ale co takiego?
Ponizej wklejam ta petle while oraz linka do calego programu.
Dziekuje za wszlekie podpowiedzi.
Pozdrawiam
caly program: http://woopnet.kom.pl/~solaris/alsa/forth.c
kompilacja: gcc forth.c -lasound -ldl -lm -o forth
Kluczowy fragment:
Kod: Zaznacz cały
val = 44100;
loops = 5000000 / val;
while (loops > 0) {
loops--;
rc = snd_pcm_readi(handle, buffer, frames);
if (rc == -EPIPE) {
/* EPIPE means overrun */
fprintf(stderr, "overrun occurred\n");
snd_pcm_prepare(handle);
} else if (rc < 0) {
fprintf(stderr,
"error from read: %s\n",
snd_strerror(rc));
} else if (rc != (int)frames) {
fprintf(stderr, "short read, read %d frames\n", rc);
}
rc = write(1, buffer, size);
if (rc != size)
fprintf(stderr,
"short write: wrote %d bytes\n", rc);
}