Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: [C++] Äänen generointi ja oman oheislaitteen kuuntelu (oli: iiiso ongelma!)

Sivun loppuun

Cooderi-Poika [01.12.2005 20:55:28]

#

Niin siis mietin, että mitenköhän C++:lla onnistuisi sellanen koodi, joka antaa ääntä tietokoneen kaijutinulostulosta ja se ääni ois sellasta piippausta. Ja sitte, miten sen piippauksen sais kuulumaan ku koneeseen kytketty painamis nappi on pohjassa?

Karza [01.12.2005 21:22:00]

#

Ainakin "\a" pistää jonkun piipperiäänen.

JoinTuanJanohon [01.12.2005 21:31:58]

#

Tere, voi käyttää esimerkiksi mmsystem.h:n valmista sndPlaySound -funktiota. Piipin joutuisit tekemään waviksi (esim. äänittämällä) itse. En oikee tierä, on onko oheisesta apua sun probleemaan, toivottavasti.

#include <stdio.h>
#include <conio.h>
#include <windows.h>
#include <mmsystem.h>

int getFileSize(FILE *fi)
{
   int x, size=0;
   if (fi)
   {
      x=ftell(fi);
      fseek(fi, 0, SEEK_END);
      size=ftell(fi);
      fseek(fi, x, SEEK_SET);
   }
   return size;
}

/*******************************************************
* Flags:                                               *
* SND_SYNC       play synchronously (default)          *
* SND_ASYNC      play asynchronously                   *
* SND_NODEFAULT  silence (!default) if sound not found *
* SND_MEMORY     pszSound points to a memory file      *
*******************************************************/

void main(void)
{
   char *piippi_wav=NULL;
   FILE *fi=fopen("piippi.wav", "rb");
   int size=getFileSize(fi);

   if (fi == NULL)
   {
      printf("tiedosto <piippi.wav> hukassa...\n");
   }
   else
   {
      piippi_wav=new char[size];
      fread(piippi_wav, sizeof(char), size, fi);
      fclose(fi);
      sndPlaySound(piippi_wav, SND_MEMORY|SND_SYNC|SND_NODEFAULT);
   }

   if (piippi_wav) delete[] piippi_wav;

   getch();
}

JoinTuanJanohon [01.12.2005 21:48:45]

#

Niin, ja sitten tuolla sndPlaySound -funktiolla voi lisäksi hallita vaikka koko peliin liittyvän ääniefektit, puheen, musiikin, jne. Lipulla SND_ASYNC funktio ei jäisi käkkimään ja oottamaan, että koska funktio on soittanut yhren minuutin alkumusiikin, vaan koodi jatkaisi eteenpäin tekemään muuta tähdellistä, esimerkiksi grafiikkaa, ja ääni jäisi soimaan taustalle.

Sitten SND_ASYNC lipulla olis tuohoisaa deletoira muistiin nykäisty wavi, kun se äänikortti sitä taustalla asynkronisesti veivaamas. Funktio osaa toistaa äänen muute suoraa kovalevyltäki tarvittaessa, jos sun mööpelis muistille olis sillä hetkellä tährellisempää käyttöä.

Mazuli [01.12.2005 22:08:35]

#

ihan vaan mihin tuota windows.h tarvitaan?

JoinTuanJanohon [01.12.2005 22:20:24]

#

:-) Hyvä huomio! Kaiketi siksi, ettei koodiesimerkki muutoin käänny. Tietty mäkin kokeilin vain 2:lla järjestelmällä, että esimerkki myös kääntyy. Voihan sitten olla joku semmoinenki järjestelmä, joka on niin viisas, että osaa itse pollata puuttuvat headerit.

Tällaiset kääntäjät ovat muuten sitä itseään. Jos jotain tarvittavaa headeria ei oo määritelty, niin ei kääntäjän pitäisi ruveta taiteilemaan, ja etsiä se älykkään oloisesti omatoimisesti. Tai jos se niin tekee, niin sen tarttis mun mielestä päivittää sellainen defekti ehdottomasti myös siihen lähteeseen, josta puute on löytyny.

Jos sun kääntäjäs on nii suurpiirteinen, että kääntää kaike vaikka väkisin, niin siks mulla on semmoiset luotettavat lisenssoidut kääntäjät, joilla pystyy sitte tekemään mahdollisimma siirrettävää koodia.

Meitsi [01.12.2005 22:37:20]

#

Suosittelen lämpimästi Windows.h:n jättämistä, ja SDL:län äänisysteemien hyödyntämistä. Onnistuu nääs n+1 kertaa helpommin, ja porttautuu linuxille. Mutta mielipidekysymys...

JoinTuanJanohon [01.12.2005 23:25:10]

#

Juu, tuo seikka on varmaan makuasia, ja riippuu paljon siitä, minkälaiseen käyttötarkoitukseen koodia on tekemäs. Esimerkiksi mun päätarve tällä hetkellä o lähinnä semmoinen CAD-tyyppinen grafiikka, jossa kovin hienoa liikkuvaa animaatiota ei tarvita. Sen sijaan näytöllä suunnitellun laitteen o sitte tärkeää toimia samalla lailla, ku se dumbataan sitte sinne sulautettuu värkii, jonka toimittama simulaatio toimii sitte tasa nii, ku sen siinä näytöllä halkuttiin toimivan. SDL vaikutti tosi mielenkiintoiselta työkalulta. Mä vaan oon varmaan sitten niin tyhmä ja vanhoihi kaavoihi kangistunu, etten mitenkään saanut SDL:lää wörkkimään BC 5.02 ja Builder 5.0 alla. Ehkä tohonkin ongelmaan löytyisi paljon tukea näiltä sivuilta. SDL:n osalta sitten varmaan joutuisi taas öpiskelemäön, että miten niitä juttuja sinne näyttölaitteelle taas paiskitaa. Ku o tehnyt Windowsin ja oma grafiikkatarpeen välille semmose suunnileen Turbo Pascalia tai Borlandin BGI:tä vastaava "grafiikkatulki", nii Windowssin PutPixel on sitten perinteisesti yksinkertaisemmin putpixel(x, y, col), eikä sinne tartte enää välittää niitä samperin HWND ja HDC, yms. kökköassosiaatioita. Varmaa muute niillä propellihatuilla, jotka Windows API:n ovat vääntäneet, nii on ollut joku tarkoitus, että tehräämpä samalle void* pointterille miljoona kaksisataa erimoista tyyppialiasta, niin sitte tätä Windows-paskaa on varmaa paljo helpompi koodata :-(


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta