Article View: pl.comp.os.linux.programowanie
Article #274Re: ALSA Sound driver
From: Andrzej Radecki
Date: Sun, 12 Sep 1999 10:55
Date: Sun, 12 Sep 1999 10:55
106 lines
4659 bytes
4659 bytes
Jacek Popławski <jp@ulgo.koti.com.pl> pisze:
>ale ja mam inne pytanie związane z dźwiękiem - czy ktokolwiek potrafi tak
>zakodować dźwięk, by był odgrywany równolegle z programem? czy muszę w tym
>celu stworzyć nowy proces? nowy wątek?
??? Przecież to udogodnienie a nie konieczność. Odpalasz nowy proces lub
chociażby wątek i po kłopocie. Nie musisz więcej kombinować z zależnościami
czasowymi itp. Do tego jeśli ktoś ma płytę z dwoma prockami będzie Cię
błogosławił za takie rozwiązanie ;-)
>w tej chwili pisze samochodówkę i chciałbym dźwięk zorganizować w ten
>sposób, że program główny będzie wysyłał komunikaty do procesu/wątku
>dźwiękowego w rodzaju "zacznij odgrywać sampel pisku opon" albo "zmień
>częstotliwość dźwięku silnika"
Szkielet może wyglądać np. tak:
// to po to aby nie było "zombiów"
void sigchld_handler(int sig)
{
int status;
printf("potomek zatrzymał się, sig %d\n",sig);
wait(&status);
}
//przekazujemy sygnały dzieciakowi
void sig_handler(int sig)
{
int status;
kill(child_pid, sig);
//tu powinno być wywołanie starej procedury obsługi sygnału
//najlepiej zrobić tablicę funkcji i wywoływać tą o indeksie sig
}
pid_t run_subprocess()
{
pid_t pid;
Message_Type message;
size_t status=0;
//tworzymy rurkę, oba końce będą widoczne w obu procesach
if (pipe(pipe_desc)!=0) return -1;
pid=fork();
if (pid != 0) return pid; //jeśli nastąpił błąd albo jesteśmy w
//rodzicu wracamy
else
{
//jestesmy w dzieciaku, czytamy (indeks 0) z rury (np. do momentu nadejścia jakiegoś komunikatu)
status = read(pipe_desc[0], &message,
sizeof(Message_Type));
sleep(60);
_exit(EXIT_FAILURE);
}
}
[...]
child_pid = run_subprocess();
if (child_pid < 0)
{
printf("nie mogę uruchomić podprocesu\n");
exit(EXIT_FAILURE);
}
signal(SIGCHLD, sigchld_handler);//przyjmujemy podproces gdy ten się
//zakończy
signal(SIGTERM, sig_handler);//przekazujemy niektóre sygnały
signal(SIGQUIT, sig_handler);//dzieciakowi, powinno zapamiętać
signal(SIGSTOP, sig_handler);//się zwracane wartości bo to
signal(SIGCONT, sig_handler);//są adresy poprzednich handlerów
signal(SIGINT, sig_handler);//sygnałów
[..]
message.message_type = 10; //jakiś numer komunikatu
message.cośtam = cośtam; //jakieś inne potrzebne dane
write(pipe_desc[1], &message, sizeof(message)); //wysyłamy rurką (indeks 1)
Oczywiście typ (struktura) Message_Type może zawierać takie pola jakie
tylko uznasz za niezbędne. Pamiętaj tylko aby forkować podproces jak
najwcześniej - fork _kopiuje_ całą pamięć używaną przez proces macierzysty
(ale oczywiście bez bibliotek) więc należy to zrobić przed zaalokowaniem
danych w procesie macierzystym. Tej wady nie nie mają wątki - dzielą one
wspólną pamięć z procesem macierzystym. Umożliwia to dodatkowo uproszczenie
komunikacji między nimi ale ta zaleta czasem okazuje się wadą - trzeba być
bardzo ostrożnym w używaniu wspólnych danych. Konieczna jest synchronizacja
dostępu do tych danych zwłaszcza gdy dwa procesy (wątki) próbują do nich
pisać. Jeśli interesuje Cię to rozwiązanie to obejrzyj przykłady w
dokumentacji glibca. W Twoim przypadku pozostałbym jednak przy klasycznym
forku - bezpieczniejsze, łatwiejsze i przy takim komunikatowym sterowaniu
równie wydajne co wątki.
>czy ktoś orientuje się jak to zrobić? nie mam żadnego doświadczenia w
>pisaniu tego typu rzeczy...
Pewnie znalazłbyś więcej chętnych do pomocy gdyby to był program "open
source" zwłaszcza, że i tak ma być darmowy (o ile dobrze pamiętam). No, ale
to Twój wybór.
Pozdrawiam,
--
( /6/ Andrzej Radecki
==== \ radecki@wpk.p.lodz.pl
/ | http://www.wpk.p.lodz.pl/~radecki
Technical Details
Message-ID:
<slrn7tn1kj.9s.radecki@radek.localdomain>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!pingwin.icm.edu.pl!mat.uni.torun.pl!radek.localdomain!radeckiReferences:
<7r9igq$q0k$1@helios.man.lublin.pl> <slrn7tjfej.5ve.jp@localhost.localdomain>Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!pingwin.icm.edu.pl!mat.uni.torun.pl!radek.localdomain!radecki From: radecki@wpk.p.lodz.pl (Andrzej Radecki) Newsgroups: pl.comp.os.linux.programowanie Subject: Re: ALSA Sound driver Supersedes: <slrn7tn198.9s.radecki@radek.localdomain> Date: 12 Sep 1999 10:55:15 GMT Organization: home Lines: 106 Message-ID: <slrn7tn1kj.9s.radecki@radek.localdomain> References: <7r9igq$q0k$1@helios.man.lublin.pl> <slrn7tjfej.5ve.jp@localhost.localdomain> NNTP-Posting-Host: pa224.lodz.ppp.tpnet.pl Mime-Version: 1.0 User-Agent: slrn/0.9.5.7 (UNIX) Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit