Thread View: pl.comp.os.linux.programowanie
5 messages
5 total messages
Started by Piotr
Thu, 09 Sep 1999 23:56
ALSA Sound driver
Author: Piotr
Date: Thu, 09 Sep 1999 23:56
Date: Thu, 09 Sep 1999 23:56
4 lines
726 bytes
726 bytes
Mam problem natury technicznej. Nie wiem czy mozna a jezeli mozna to jak to zrobic zeby otwarzac dwa wav-y na raz. ticket@friko4.onet.pl
Re: ALSA Sound driver
Author: Stanislaw Kazimierz Sawa
Date: Fri, 10 Sep 1999 10:04
Date: Fri, 10 Sep 1999 10:04
8 lines
1194 bytes
1194 bytes
Piotr <ticket@friko4.onet.pl> wrote: > Mam problem natury technicznej. Nie wiem czy mozna a jezeli mozna to jak to > zrobic zeby otwarzac dwa wav-y na raz. Sproboj pakietu esound. Jest to taki maly serwer dzwiekow. Umozliwia odpalenie kilku dzwiekow rownolegle. Dziala na OSS, ale i powinien na ALSA'ie. -- Stanislaw Sawa ssawa@elka.pw.edu.pl
Re: ALSA Sound driver
Author: Jacek Popławski
Date: Sat, 11 Sep 1999 02:55
Date: Sat, 11 Sep 1999 02:55
14 lines
1554 bytes
1554 bytes
Piotr wrote: >Mam problem natury technicznej. Nie wiem czy mozna a jezeli mozna to jak to >zrobic zeby otwarzac dwa wav-y na raz. można, wystarczy je wymiksować :-) 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? 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" czy ktoś orientuje się jak to zrobić? nie mam żadnego doświadczenia w pisaniu tego typu rzeczy...
Re: ALSA Sound driver
Author: 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
Re: ALSA Sound driver
Author: Jacek Popławski
Date: Tue, 14 Sep 1999 22:14
Date: Tue, 14 Sep 1999 22:14
5 lines
1077 bytes
1077 bytes
Andrzej Radecki wrote: >Szkielet może wyglądać np. tak: uff... dzięki za ten wykładzik :) musi minąć jeszcze parę dni zanim tego spróbuję... (brak czasu!)
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads