ALSA - zasada wykorzystania petli while

Bash, C, C++, Java, PHP, Ruby, GTK, Qt i wiele innych - wszystko tutaj.
Awatar użytkownika
marconi
Piegowaty Guziec
Piegowaty Guziec
Posty: 18
Rejestracja: 08 sty 2007, 15:11
Płeć: Mężczyzna
Wersja Ubuntu: 9.10
Środowisko graficzne: GNOME
Architektura: x86

ALSA - zasada wykorzystania petli while

Post autor: marconi »

Czesc!
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);
  }
bedzie co ma byc...
Awatar użytkownika
swistakmc
Wygnańcy
Posty: 48
Rejestracja: 11 gru 2007, 23:14
Płeć: Mężczyzna
Wersja Ubuntu: 8.10
Środowisko graficzne: GNOME
Kontakt:

Odp: ALSA - zasada wykorzystania petli while

Post autor: swistakmc »

snd_pcm_readi(handle, buffer, frames);
pewnie w tej funkcji jest cos wiecej na ten temat ;)
ODPOWIEDZ

Wróć do „Programowanie”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 8 gości