🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.os.linux.programowanie
Article #274

Re: ALSA Sound driver

#274
From: 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
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!radecki
References: <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