🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.os.linux.programowanie
5 messages
5 total messages Started by Piotr Thu, 09 Sep 1999 23:56
ALSA Sound driver
#271
Author: Piotr
Date: Thu, 09 Sep 1999 23:56
4 lines
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
#272
Author: Stanislaw Kazimierz Sawa
Date: Fri, 10 Sep 1999 10:04
8 lines
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
#273
Author: Jacek Popławski
Date: Sat, 11 Sep 1999 02:55
14 lines
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
#274
Author: Andrzej Radecki
Date: Sun, 12 Sep 1999 10:55
106 lines
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
#275
Author: Jacek Popławski
Date: Tue, 14 Sep 1999 22:14
5 lines
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