/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
Meget simpelt Direct Sound program virker ~
Fra : Jacob Jensen


Dato : 16-08-06 22:10

Hej gruppe.

Jeg starter en ny tråd da emnet ellers ville være vildledende. Før gik det
ud på at fylde noget syntetisk, men meningsfyldt, i min buffer og så
afspille den. Nu har jeg valgt at prøve at hente "rigtigt" PCM-data ind fra
en wav-fil. Det må simpelt hen kunne bringes til at virke det her.

Jeg ved, at jeg har fået indlæst wav-data rigtigt fordi jeg har sammenlignet
indholdet af min byte-buffer i programmet med indholdet af wav-filen (det
fandt jeg med en hex-editor). Jeg skriver også alle header-informationerne
ud på skærmen under parsing af wav-filen og det ser alt sammen godt ud.
Wav-filen indeholder blot 3 sekunders 440Hz sinusbølge. Formatet er
8bits/sample, mono, 22050 samples/sec.

Jeg hører stadig blot et "klik" i højtalerne. Hvad kan der mon være galt?
Jeg har efterhånden læst hele DirectSound hjælpen tror jeg :)

Jeg har placeret koden på adressen nedenfor hvis nogle gider kigge på den.
Det ville være rigtigt rart hvis jeg blot kunne bringe direct sound til at
afspille denne lille lydfil. Programmet består sådan set bare af en
winMain-funktion som kalder en playSound-funktion som kalder en
readWave-funktion. Hvis koden ellers virker uoverskuelig så skriv endelig.
Det meste er standard-kald til DirectSound og tjek af returværdierne.

http://home20.inet.tele.dk/omo/dsound.cpp

Foreløbig ignorerer jeg blot headerværdierne i wav-filen under parsing af
den, men jeg skriver dem lige ud for at sikre mig at de er som de skal være.
Et andet sted har jeg så angivet værdierne direkte i koden (i en
waveFormat-struct). Det skal selvfølgeligt laves om, sammen med en masse
andet, hvis jeg får det her til at køre.

På forhånd mange tak for evt. hjælp.

Jacob




--
Jacob Jensen
E-mail: jacob@etlivmedsle.dk
Hjemmeside: www.etlivmedsle.dk



 
 
Ivan Johansen (16-08-2006)
Kommentar
Fra : Ivan Johansen


Dato : 16-08-06 23:22

Jacob Jensen wrote:
>
> http://home20.inet.tele.dk/omo/dsound.cpp

Jeg har kun kigget hurtigt på det men jeg kan se at dine fejlcheck er
forkerte:
if(!soundBuffer8->Play(0,0,DSBPLAY_LOOPING) == DS_OK)

Da ! har højere præcedens end == skal du enten bruge en parentes:
if(!(soundBuffer8->Play(0,0,DSBPLAY_LOOPING) == DS_OK))
eller bruge !=
if(soundBuffer8->Play(0,0,DSBPLAY_LOOPING) != DS_OK)

Dette er dog næppe grunden til dit problem.

Har du overvejet om kaldet til Relese() for soundBuffer8 eller dsDevice
til sidst får afspilningen til at stoppe? Måske du skulle vente med at
frigive objekterne.

Ivan Johansen




Jacob Jensen (17-08-2006)
Kommentar
Fra : Jacob Jensen


Dato : 17-08-06 06:42

> Jeg har kun kigget hurtigt på det men jeg kan se at dine fejlcheck er
> forkerte:
> if(!soundBuffer8->Play(0,0,DSBPLAY_LOOPING) == DS_OK)

Det var da en irriterende fejl. Men det er da underligt det virker er det
ikke? Jeg har lige kigget i dokumentationen og DS_OK = 0x00000000.

> Dette er dog næppe grunden til dit problem.

Nu er det i hvert fald rettet.

> Har du overvejet om kaldet til Relese() for soundBuffer8 eller dsDevice
> til sidst får afspilningen til at stoppe? Måske du skulle vente med at
> frigive objekterne.

Ha! Tusind tak. Mere kan jeg ikke sige.

Det er egentligt mærkeligt at Release slet ikke er dokumenteret. Jeg skal
nok holde øje med playPosition eller sådan noget (der er noget med at man
kan sætte en timerevent) og så først kalde Release når jeg ikke har brug for
bufferen mere.

Der er i øvrigt en anden ting jeg ikke forstår.

Jeg fandt denne kode et sted i en tutorial:
if(soundBuffer->QueryInterface(IID_IDirectSoundBuffer8, (LPVOID*)
soundBuffer8) != DS_OK)

....men den får programmet til at crashe. Det her virker til gengæld:
if(soundBuffer->QueryInterface(IID_IDirectSoundBuffer8, (void**)
&soundBuffer8) != DS_OK)

Er det ikke lidt underligt? Er (LPVOID*) ikke det samme som (void**)?
Oversætteren melder inden fejl. Jeg kan i øvrigt heller ikke finde
QueryInterface i dokumentationen.

Nå, nu vil jeg lige gøre programmet lidt pænere. Meningen er at jeg skal
opfange lyd fra min mikrofon og analysere frekvensen så jeg kan bruge det
til at stemme et instrument. Jeg regner med at jeg kan lave noget
fourier-analyse og bruge grundfrekvensen eller sådan noget, men det skal jeg
lige have undersøgt.

Jacob



Ivan Johansen (17-08-2006)
Kommentar
Fra : Ivan Johansen


Dato : 17-08-06 07:58

Jacob Jensen wrote:
> Det er egentligt mærkeligt at Release slet ikke er dokumenteret. Jeg skal
> nok holde øje med playPosition eller sådan noget (der er noget med at man
> kan sætte en timerevent) og så først kalde Release når jeg ikke har brug for
> bufferen mere.

Release() er dokumenteret i IUnknown.

> Der er i øvrigt en anden ting jeg ikke forstår.
>
> Jeg fandt denne kode et sted i en tutorial:
> if(soundBuffer->QueryInterface(IID_IDirectSoundBuffer8, (LPVOID*)
> soundBuffer8) != DS_OK)
>
> ...men den får programmet til at crashe. Det her virker til gengæld:
> if(soundBuffer->QueryInterface(IID_IDirectSoundBuffer8, (void**)
> &soundBuffer8) != DS_OK)

Bemærk at du her tager adressen på pointeren (&soundBuffer8) hvor du
øverst caster selve pointeren (soundBuffer8).

> Er det ikke lidt underligt? Er (LPVOID*) ikke det samme som (void**)?
> Oversætteren melder inden fejl. Jeg kan i øvrigt heller ikke finde
> QueryInterface i dokumentationen.

QueryInterface() er også dokumenteret i IUnknown. IUnknown er det
grundlæggende interface som alle andre interfaces i COM er nedarvet fra.

Ivan Johansen

Jacob Jensen (17-08-2006)
Kommentar
Fra : Jacob Jensen


Dato : 17-08-06 15:19

> Release() er dokumenteret i IUnknown.

Tak. Jeg har ikke helt styr på de interfaces og objekter og hvordan de
hænger sammen endnu.

> Bemærk at du her tager adressen på pointeren (&soundBuffer8) hvor du
> øverst caster selve pointeren (soundBuffer8).

Jeg var alt for træt i morges :)

> QueryInterface() er også dokumenteret i IUnknown. IUnknown er det
> grundlæggende interface som alle andre interfaces i COM er nedarvet fra.

Ok. Jeg må også sætte mig ind i COM. Jeg er helt uvidende på det område.

Jacob



Søg
Reklame
Statistik
Spørgsmål : 177577
Tips : 31968
Nyheder : 719565
Indlæg : 6409071
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste