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?
Ainakin "\a" pistää jonkun piipperiäänen.
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(); }
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öä.
ihan vaan mihin tuota windows.h tarvitaan?
:-) 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.
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...
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 :-(
Aihe on jo aika vanha, joten et voi enää vastata siihen.