7. fejezet - Hogyan tudok lejátszani egy wav fájlt
Hogyan játszanak a WAV fájlt
Nem vagyok hülye - legalábbis a feleségem hív így nyíltan - olyan Fogadok, hogy elsősorban azt szeretné, hogy megtanulják, hogyan kell játszani a WAV fájlokat. Nem tudok egy jobb módja a tanulás, mint a csodálatos világ a forráskódot. Tehát betölteni DMusic_PlaySound projekt segédfájlok a könyvet.
DMusic_PlaySound program mutatja, hogyan kell inicializálni előadóművész és a rakodó felületek, a terhelési szegmens és játszani.
DMusic_PlaySound projekt
A program tartalmaz egy sor forrás fájlok: main.cpp. main.h és DXUtil.cpp. Mindegyikük egyedi projekt kivételével DXUtil.cpp fájlt. amely része a DirectX SDK támogatja fájlok.
A projekt az alábbi könyvtárak: dxguid.lib. winmm.lib és dsound.lib. Lehet kérdezni, hogy miért nem a könyvtár nevű dmusic.lib. Nem tudom, hogy mit kell válaszolni. A Microsoft úgy döntött, hogy a funkció a DirectMusic DirectSound könyvtárban. Feltételezem, hogy ez annak a ténynek köszönhető, hogy ezek többnyire azonos logikát.
Amit én még nem mutattam meg új illusztrációk. Megnézzük ábra. 7.1, ami azt mutatja, a fő áramlási a példa program.
Ábra. 7.1. Az áramlási végrehajtási program DMusic_PlaySound
Ábra. 7.1 azt mutatja, hogy WinMain () okoz bInitializeSoundSystem () függvény. Ez inicializálási függvény a több hívás a DirectX funkciók elindítani a hangrendszer. A program ezután vár egér események és játszik WAV fájlt vPlaySound () függvényt. Ha még nem tette meg, a program futtatásához, és kattintson az ablak bal egérgombbal, hogy játsszon egy WAV fájl. Nem tetszik ez a csodálatos teszt WAV fájlt? Hé, tudom, hogy ez nem meggyőző. Ha azt szeretnénk, hogy a kísérlet, változtassa meg a fájl testsound.wav egy saját hangfájlokat. A program kell dolgozni minden WAV-fájlt.
Header file Main.h
Nyisd main.h header fájlt, és kövessen engem. A fejléc fájlt erre a példa nagyon egyszerű és rövid. Itt van a teljes:
A lista tartalmazza a fájlok nem kapsz sok meglepetés. Alapvetően ez általában magában foglalja a fájlok a Windows-alapú programok. Az egyetlen fájlt adunk kifejezetten DirectMusic - Ez dmusici.h.
A prototípus tartalmaz két új funkciót: bInitializeSoundSystem () és vPlaySound (). Kinevezése két nyilvánvaló nevüket. (Nem szereted öndokumentáló kódot?)
A következő kódrészletet header fájl tartalmazza a globális változók, amit használni a programban. Ha elolvasod az előző részben ennek a fejezetnek, meg kell nézni nagyon ismerős. G_pLoader interfész a teher egy audio fájlt, g_pPerformance felületet úgy tervezték, audio lejátszás és g_pSound felület tartalmaz letölthető a hangadatfájíban.
Nem javasoljuk, hogy a globális változók a kódot. Én használni őket csak a példákban annak érdekében, hogy a kód a lehető legegyszerűbben.
Main.cpp program fájlt
A fő rész a kód fájlban található main.cpp programot. Itt az ideje, hogy nyissa meg. Mint általában, a mi figyelmet kell WinMain () függvényt. Ez tartalmaz egy szabványos Windows alkalmazás inicializáló kódot, és számos új funkció hívásokat. Itt van egy kódrészlet, amely érdekes lehet az Ön számára:
Hívom bInitializeSoundSystem () függvény után azonnal létre ablakot. A függvény egy paramétert - a kilincs. Ha a függvény értéke 0, akkor annak végrehajtása sikertelen lesz. Ebben az esetben, hozom a képernyőn egy ablak hibaüzenetet és leállítja a program működése, miután a felhasználó rákattint az OK gombot. Egyébként minden megfelelően működik, és a kód végrehajtása folytatódik.
bInitializeSoundSystem funkció ()
Ó srácok, az igazi móka most kezdődik. Ez a funkció tartalmazza az összes szükséges kódot inicializálni DirectMusic. Különben is, ez letölti a hangfájl lejátszási program.
Hogyan kell inicializálni COM
Az első dolog az, hogy a kód, - COM elindulni. DirectX használ COM-felületek, így ez egy szükséges rossz (vagy jó). Ha nem ismeri a COM, azt javasoljuk, hogy menjen a kedvenc könyvesboltba, és látni néhány könyvet szentelt ennek a technológiának. Pályázati inicializálás a következő:
Rendkívül egyszerű, ugye? Szerencsére ez csak annyit kell tennie, hogy COM inicializálása. Ezután létrehozhat egy DirectX interfészek.
Létrehozása rakodó felület
A következő kódrészlet létrehoz egy rakodó felület. Mint bizonyára emlékeznek rá, a rakodó felület betöltéséért felelős hang-adat, mint a WAV, MIDI-fájlok fájlokat. Itt látható a megfelelő kód:
Hívom CoCreateInstance () függvényt, hogy a rakodó felület. IDirectMusicLoader8 felületet használja az azonosítót és CLSID CLSID_DirectMusicLoader IID_IDirectMusicLoader8 felület. Interfész mutató van tárolva a globális változó g_pLoader.
Tudom, hogy ha nem ismerik a COM, mindez úgy hangzik, egy kicsit idegen, de nincs ok az aggodalomra. Csak azt kell másolni a kódot a saját programját. DirectMusic kell módosítani a inicializáló kódot itt bemutatott rendkívül ritka.
Készítsen előadói interfész
Rakodó felület, ez megtörtént, és a következő lépés, hogy hozzon létre egy interfész művész. Executive interfész felelős a reprodukciós audio adatok, és létfontosságú a DirectMusic. Itt van a kód inicializálása a felületet:
És ismét, hogy hozzon létre egy felületet használom a CoCreateInstance () függvényt. IDirectPerformance8 felületet használja az azonosítót és CLSID CLSID_DirectMusicPerformance IID_DirectMusicPerformance8 felület. A mutató a felület tárolom a globális változó g_pPerformance.
inicializálása audio
Ellentétben a bootloader, művész megköveteli, hogy sikeresen építette interface inicializálása megtörtént. Ezt a feladatot végzi funkció IDirectMusicPerformance8 :: InitAudio (). ami inicializálja a végrehajtó és beállítja a hangútvonalat neki. Itt a függvény prototípus:
Az első paraméter, ppDirectMusic. Ez lehetővé teszi, hogy a függvény visszaadja létrehozott DirectMusic felületen. Ha ez a paraméter NULL. DirectMusic felület jön létre és használják belsőleg a tárgy művész. Én szívesebben használják NULL. mert egyszerűsíti a kódot.
A második lehetőség az azonos célra, mint az első, azzal az eltéréssel, hogy a boltokban, vagy letölti a DirectSound interfész. Mert ez a lehetőség, én szívesebben használják a NULL értéket.
A harmadik paraméter, HWND. úgy tervezték, hogy továbbítja a leíró egy ablak jön létre DirectSound interfész. Ha az érték NULL. használt háttérben ablakon. Én szívesebben használják NULL itt.
A negyedik paraméter, dwDefaultPathType. típusát adja meg a hangútvonalat alapértelmezés szerint. Lehetséges értékek táblázatban vannak felsorolva 7.4.
7.4 táblázat. A fajta audio útvonal
A rendelkezésre álló típusok szoktam használni DMUS_APATH_DYNAMIC_STEREO, mert ez biztosítja a szükséges képességek sztereó hanggal.
Az ötödik paraméter, dwPChannelCount. számát adja használt hangútvonalat csatorna előadóművész. Ebben a példában azt használja négy csatornán.
A hatodik paraméter, dwFlags. Ez lehetővé teszi, hogy meghatározza a szolgáltatásokhoz, amelyek a megtekinteni kívánt tárgy művész. Elérhető zászlók és azok funkciói a táblázat 7.5.
7.5 táblázat. Zászlók alkalmassága művész
Ebben a példában azt használja DMUS_AUDIOF_ALL zászló. Rámutat előadóművész objektum használni minden rendelkezésre álló lehetőséget. Ez egy kényelmes lehetőség, amely lehetővé teszi a felhasználó számára, hogy letilt bizonyos funkciókat, hogy vezethet teljesítménycsökkenést.
A hetedik lehetőség, pParams. Ez lehetővé teszi, hogy beállítsa a kívánt audio paramétereket DMUS_AUDIOPARAMS adatszerkezeteket. Általában az alapértelmezett beállításokat használja, és pont itt NULL.
Az inicializálási funkció audio rendszer tette a dolgát. Az utolsó lépés szükséges elindítani a művész felület - hívja IDirectMusicPerformance8 :: GetDefaultAudioPath () függvényt. helyreállítása hangútvonalat alapértelmezés szerint létrehozott audio inicializálási funkciót. Hangútvonalat szükséges állítsa be a hangerőt. Ha nem akar bajlódni hangerőszabályzó, akkor ez a lépés kihagyható.
Itt a kód, amely a fent szöveg:
Hogyan állítsa be a hangerőt
Amint azt korábban utalt, IDirectMusicAudioPath8 felület lehetővé teszi, hogy beállítsa a hangerőt. Mert ez SetVolume () függvény. amely úgy néz ki, mint egy prototípus a következők:
Az első paraméter, lVolume. beállítja a hangerőt a kívánt szintre száz decibel. Az érvényes értékek -9600 a 0. A 0 érték felel meg a maximális térfogat.
A második paraméter, dwDuration. Ez meghatározza azt az időtartamot, amelyre a változás végezzük kötetet. Ha értéke 0, a rendszer meg fogja változtatni a hangerőt a lehető leghamarabb.
Itt van a kód a példában alkalmazott:
Letöltés hangfájlt
Emlékszel a rakodó felület, amely létrehozott egy perce? Itt az ideje, hogy használja újra letölteni a vizsgálat WAV fájlt, a csatolt fájlokat. Ehhez fordulunk LoadObjectFromFile () függvényt. Mielőtt megmutatom egy prototípus, megnézzük a kódot a program:
A kód Én használ a fájl letöltési funkciót, a WAV-fájlt a merevlemezre. Aztán betölteni a szegmens lejátszás objektum művész. Itt van, amit látható a madár repülés.
LoadObjectFromFile () függvény prototípusa a következőképpen:
Az első paraméter, rguidClassID. egyedi azonosítója is át kell adni. Letölteni egy szegmenst használja az osztály azonosító CLSID_DirectMusicSegment.
A második paraméter, iidInterfaceID. Egyedinek kell lennie interfész azonosító. Letölteni egy szegmenshez IID_IDirectMusicSegment8.
A harmadik paraméter, pwzFilePath. a neve a feltöltött fájl. Ebben a példában azt használja testsound.wav fájlt. Láthatjuk az L betű, mielőtt a vonal a fájl nevét. Tettem, mert ezt a paramétert kell átadni a neve a Unicode (ahol két bájtot használnak az egyetlen karakter).
Hogyan lehet letölteni részes
Most kell, hogy töltse le a szegmenst a tárgy művész. Ez a feladat az egyes funkcióknál IDirectMusicSegment8 :: Download (). akinek prototípus néz ki:
Milyen szép és egyszerű. Csak az egyik paraméter, amely egy mutató, hogy a felület, amelyet betöltve szegmens. Én ebben a paraméter egy mutató egy objektum g_pPerformance művész.
Megnézzük ábra. 7.2 hogy a leírt lépések eddig a pontig.
Ábra. 7.2. Szakaszai inicializálni DirectMusic
Ábra. 7.2 ábrán látható, hogy inicializálja a COM, létrehozott egy boot loader létrehozott művész, inicializálja az audio kapott hangútvonalat alapértelmezés szerint állítsa be a hangerőt, a letöltött fájlt, és végül betöltött WAV szegmensben. Ez lépésekkel kell ismételni minden alkalommal szeretnénk használni a programokban DirectMusic, úgy emlékszem (vagy legalábbis újra ezt az oldalt).
vPlaySound funkció ()
A mintaprogram kezeli azokat az eseményeket a bal egérgombot, és kéri, hogy minden esemény vPlaySound () függvényt. Esemény feldolgozás történik fnMessageProcessor () függvényt. de a kód az érdeklődés hajtunk végre az audio lejátszás funkció. Nézzük meg ezt a kódot funkció:
vPlaySound () függvény nagyon egyszerű. Sőt, ez áll egy hívás IDirectMusicPerformance8 :: PlaySegmentEx () függvényt.
hangvisszaadás
PlaySegmentEx () függvény elkezdi lejátszani a betöltött szegmenst. Ő több lehetőség, de mint látható a kódot a példámat értékét sokan egyenlő NULL. Itt a függvény prototípus:
Az első paraméter, pSource. egy mutatót az interfész az objektum reprodukálni. A vizsgált program, amit egy globális mutatót a szegmensben, ami végeztük betöltés előtt.
A második paraméter, pwzSegmentName. DirectX 9.0 nem használják.
A harmadik paraméter, pTransition. Ez lehetővé teszi, hogy meghatározza a modulációs szegmensben. Átadom NULL erre a paraméterre.
A negyedik paraméter, dwFlags. Ez lehetővé teszi, hogy meghatározza egy sor zászlók, amelyek meghatározzák a különböző lejátszási opciókat. A példában ez a paraméter azt használja zászlók DMUS_SEGF_DEFAULT és DMUS_SEGF_SECONDARY. Ezek zászlók jelzik, hogy a szegmens reprodukálják az alapértelmezett határokat, és hogy a szegmens kerül lejátszásra másodlagos hangot. Elérhető számos más zászlók, és azt javasoljuk, hogy nézd őket a DirectX SDK dokumentációban.
Az ötödik paraméter, i64StartTime. Ez határozza meg a kezdő időt a szegmensben. Átadom NULL ezt a paramétert a hang lejátszás azonnal elindul.
A hetedik lehetőség, pFrom. Ez lehetővé teszi, hogy meghatározza a felület, hogy hagyja abba a lejátszást, ha új szegmens elkezd. Itt is át NULL.
A nyolcadik paraméter pAudioPath. Azt mondja a rendszer, amely hangútvonalat használják a lejátszás szegmensben. Én feltételezve ez az érték NULL lejátszására használható hangútvonalat alapértelmezés szerint.
Most futtassuk a programot, és kattintson egy párszor az ablakán, a bal egérgombbal. Fontos jellemzője a programnak, hogy egyszerre játszani több hangok. Ez nem sok benyomást rád, ha még soha nem vesznek részt a lejátszott hang, de hidd el - ez nagyon cool. Figyelemre méltó, hogy DirectMusic, hogy végre minden szükséges pufferelés.