Capitolul 7 - Cum pot reda un fișier wav

Cum pot reda un fișier WAV

Nu sunt un idiot - cel puțin, soția mea mă cheamă atât de deschis - așa că am pariu că doriți în primul rând să învețe cum să joace fișiere WAV. Nu mă pot gândi la o modalitate mai bună de a învăța decât minunata lume a codului sursă. Deci, incarca DMusic_PlaySound proiect din fișierele Sidecar pentru carte.

Programul DMusic_PlaySound demonstrează cum să inițializa un interpret și un încărcător interfețe, segmentul de încărcare și să se joace.

proiectul DMusic_PlaySound

Programul conține un număr de fișiere sursă: main.cpp. main.h și DXUtil.cpp. Toate acestea sunt unice pentru proiect, cu excepția fișierelor DXUtil.cpp. care face parte din fișierele de suport DirectX SDK.

Proiectul utilizează următoarele biblioteci: dxguid.lib. winmm.lib și dsound.lib. Ați putea întreba, de ce nu o bibliotecă numit dmusic.lib. Nu știu ce să-ți răspund. Microsoft a decis să pună funcția în biblioteca DirectMusic DirectSound. Presupun că acest lucru se datorează faptului că ele au cea mai mare parte aceeași logică.

Ceva ce nu v-am arătat noi ilustrații. Uitați-vă la Fig. 7.1, care prezintă fluxul principal al programului de exemplu.


Capitolul 7 - Cum pot reda un fișier wav

Fig. 7.1. Programul de implementare a fluxului DMusic_PlaySound

Fig. 7.1 arată că WinMain () determină funcția bInitializeSoundSystem (). Această funcție de inițializare îndeplinește mai multe apeluri la funcțiile DirectX pentru a inițializa sistemul de sunet. Programul așteaptă apoi pentru evenimente mouse-ul și joacă un fișier WAV utilizând funcția vPlaySound (). Dacă nu ați făcut deja acest lucru, executați programul și faceți clic pe fereastra sa, butonul stânga al mouse-ului pentru a reda un fișier WAV. nu vă place acest minunat fișier WAV de test? Hei, eu știu că nu este impresionant. Dacă doriți să experimentați, schimbați fișierul testsound.wav unul dintre propriile fișiere de sunet. Programul ar trebui să funcționeze cu orice fișier WAV.

Main.h fișier antet

Deschideți fișierul antet main.h și urmați-mă. Fișierul antet pentru acest exemplu este foarte simplu și scurt. Aici este în întregime:

Lista de fișiere incluse nu ar trebui să vă dea mai multe surprize. Practic acesta include, de obicei, fișiere pentru programe bazate pe Windows. Singurul fișier care este adăugat în mod specific pentru DirectMusic - Acest dmusici.h.

În prototipul are două noi funcții: bInitializeSoundSystem () și vPlaySound (). Numirea a două evidente din numele lor. (Nu te iubesc codul de auto-documentarea?)

Blocul următor de fișier antet de cod conține variabile globale pe care le folosesc în program. Dacă ați citit secțiunea anterioară a acestui capitol, acestea ar trebui să arate foarte familiar. Interfața G_pLoader este utilizată pentru a încărca un fișier audio, interfață g_pPerformance este proiectat pentru redarea audio și interfața g_pSound conține descărcabil din fișierul de date audio.

Nu vă recomandăm să utilizați variabile globale în cod. Eu le folosesc numai în exemple pentru a face codul cât mai ușor posibil.

fișier de program main.cpp

Cea mai mare parte a codului situat în programul de fișiere main.cpp. Este timpul să-l deschidă. Ca de obicei, atenția noastră trebuie să WinMain funcția (). Acesta conține un cod standard de inițializare aplicație Windows, și câteva noi apeluri de funcții. Aici este un fragment de cod care ar trebui să fie de interes pentru tine:

Eu numesc funcția bInitializeSoundSystem (), imediat după ce a fost creat fereastra. Funcția are un parametru - mânerul ferestrei. Dacă funcția returnează 0, atunci punerea sa în aplicare va eșua. În acest caz, voi aduce pe ecran o fereastra cu un mesaj de eroare și se termină operația de program după ce utilizatorul face clic pe butonul OK. În caz contrar, totul funcționează cum era de așteptat, iar executarea de cod continuă.

Funcția bInitializeSoundSystem ()

Oh, băieți, distracția adevărată începe chiar acum. Această funcție conține toate codul necesar pentru a inițializa DirectMusic. În plus, acesta este descărcarea de software-ul de redare fișier audio.

Cum să inițializa COM

Primul lucru este de a face codul, - COM initializare. DirectX utilizează COM-interfețele, deci este un rău necesar (sau bun). Dacă nu sunteți familiarizați cu COM, vă recomand să mergeți la librărie preferată și a vedea câteva cărți dedicate acestei tehnologii. Apel pentru inițializare este după cum urmează:

Extrem de simplu, nu? Din fericire, acest lucru este tot ce trebuie să faceți pentru a inițializa COM. Apoi, puteți crea un interfețe DirectX.

Crearea unei interfețe încărcător

Următorul fragment de cod creează o interfață încărcător. După cum vă amintiți, interfața încărcător este responsabil pentru încărcarea de date audio, cum ar fi WAV, MIDI fișiere de fișiere. Aici este codul relevant:

Eu numesc CoCreateInstance funcția () pentru a obține interfața încărcător. Interfața IDirectMusicLoader8 utilizează ID-ul și interfața CLSID CLSID_DirectMusicLoader IID_IDirectMusicLoader8. indicator interfață este stocată într-o variabilă g_pLoader la nivel mondial.

Știu că, dacă nu sunteți familiarizat cu COM, toate acestea ar putea suna un pic străin pentru tine, dar nici un motiv de îngrijorare. Trebuie doar să copiați codul în propriul program. necesitatea DirectMusic de a modifica codul de inițializare prezentat aici este extrem de rară.

Crearea de interfață artist

interfață Loader proiectat a avut loc, iar următorul pas este de a crea un artist de interfață. Interfața executiv este responsabil pentru reproducerea datelor audio, și este vital pentru DirectMusic. Aici este codul de inițializare a interfeței:

Și din nou, pentru a crea o interfață utiliza funcția CoCreateInstance (). Interfața IDirectPerformance8 utilizează ID-ul și interfața CLSID CLSID_DirectMusicPerformance IID_DirectMusicPerformance8. Un pointer la interfața I stoca într-o g_pPerformance variabilă la nivel mondial.

Inițializare audio

Spre deosebire de bootloader, artistul cere ca ai construit cu succes inițializarea interfață a fost efectuată. Această sarcină este realizată prin funcția IDirectMusicPerformance8 :: InitAudio (). care inițializează executor și setează calea audio pentru el. Iată prototipul funcției:

Primul parametru, ppDirectMusic. Acesta permite funcția de a reveni la interfața DirectMusic creată. Dacă acest parametru este NULL. Interfața DirectMusic este creat si utilizat intern de artist obiect. Eu prefer să folosesc NULL. deoarece simplifică codul.

A doua opțiune este în același scop ca și primul, cu excepția celor de magazine sau preia interfața DirectSound. Pentru această opțiune, prefer să folosesc o valoare NULL.

Al treilea parametru, hWnd. este proiectat pentru a transmite un descriptor al unei ferestre este creat pentru interfața DirectSound. Dacă valoarea este NULL. folosit o fereastra de fundal. Eu prefer să folosesc NULL aici.

Al patrulea parametru, dwDefaultPathType. specifică tipul de calea audio implicit. Valorile posibile sunt listate în Tabelul 7.4.

Tabelul 7.4. Tipurile de cale audio

Dintre tipurile disponibile de obicei folosesc DMUS_APATH_DYNAMIC_STEREO deoarece oferă capacitățile necesare pentru sunet stereo.

Al cincilea parametru, dwPChannelCount. specifică numărul utilizat în audio canale de cale performer. În acest exemplu, am folosi patru canale.

Al șaselea parametru, dwFlags. Acesta vă permite să specificați un set de caracteristici pe care doriți să le vedeți artist obiect. steaguri disponibile și funcțiile lor sunt descrise în Tabelul 7.5.

Tabelul 7.5. artist funcționalitate Steaguri

În acest exemplu, eu folosesc pavilion DMUS_AUDIOF_ALL. El subliniază obiect interpret de a utiliza orice oportunitate disponibile. Aceasta este o opțiune convenabilă, care permite utilizatorului să dezactiveze anumite caracteristici care pot duce la degradarea performanței.

A șaptea opțiune, pParams. Acesta vă permite să setați parametrii audio dorit ca structuri de date DMUS_AUDIOPARAMS. Eu folosesc de obicei, setările implicite și punctul de aici NULL.

Sistemul audio funcția de inițializare a făcut treaba. Ultimul pas necesar pentru a inițializa interfața artist - apelează funcția IDirectMusicPerformance8 :: GetDefaultAudioPath (). restaurarea calea audio în mod implicit, a creat funcția de inițializare audio. calea audio este necesară pentru a seta nivelul volumului. Dacă nu vrei să te pui cu control al volumului, puteți sări peste acest pas.

Aici este codul pe care este descrisă în textul de mai sus:

Cum de a regla volumul

Așa cum am sugerat mai devreme, interfata IDirectMusicAudioPath8 vă permite să reglați nivelul volumului. Pentru aceasta este SetVolume) funcția (. care arată ca un prototip urmează:

Primul parametru, lVolume. setează volumul la nivelul dorit în sute de decibeli. Valorile valide sunt -9600 la 0. Valoarea 0 corespunde volumului maxim.

Al doilea parametru, dwDuration. Acesta specifică perioada de timp pentru care schimbarea este efectuată volum. În cazul în care valoarea sa este 0, sistemul se va schimba volumul, cât mai curând posibil.

Aici este codul utilizat în exemplul:

Descărcați fișierul audio

Vă amintiți interfața încărcător, care a creat un moment în urmă? Este timpul să-l folosească din nou pentru a descărca fișierul de test WAV, incluse în fișierele însoțitoare. Pentru a face acest lucru, ne întoarcem la funcția LoadObjectFromFile (). Înainte să vă arăt un prototip, să ia o privire la codul programului:

Codul Sunt folosind funcția de descărcare de fișiere pentru a descărca fișier WAV de pe hard disk. Apoi am încărca segmentul de artist obiect de redare. Iată ce poate fi văzut de zbor de pasăre.

LoadObjectFromFile () funcția de prototip este următoarea:

Primul parametru, rguidClassID. un identificator unic de clasă ar trebui să fie trecut. Pentru a descărca un segment folosind CLSID_DirectMusicSegment identificator de clasă.

Al doilea parametru, iidInterfaceID. Acesta trebuie să fie identificator unic de interfață. Pentru a descărca un segment folosind IID_IDirectMusicSegment8.

Al treilea parametru, pwzFilePath. este numele fișierului încărcat. În acest exemplu, eu folosesc fișier testsound.wav. Puteti vedea litera L înainte de linia cu numele fișierului. Am pus-o, deoarece acest parametru ar trebui să fie trecut numele Unicode (în cazul în care doi octeți sunt folosite pentru a reprezenta un singur caracter).

Cum se descarcă segmentul

Acum trebuie să descărcați segmentul în artist de obiect. Această sarcină îndeplinește o funcție IDirectMusicSegment8 :: Descărcare (). al cărui prototip arată astfel:

Cât de frumos și simplu. Doar un singur parametru, care este un pointer la interfata, care este încărcată de segment. Sunt în acest parametru este un pointer la un artist obiect g_pPerformance.

Uitați-vă la Fig. 7.2 pentru a vedea pașii descriși până la acest punct.



Fig. 7.2. Etapele inițializa DirectMusic

Fig. 7.2 arată modul în care inițializa COM, a creat un încărcător de boot set-up artist, inițializa audio a primit calea audio în mod implicit, setați volumul, fișierul descărcat, și în cele din urmă încărcate segmentul WAV. Acest set de măsuri se va repeta de fiecare dată când doriți să utilizați în programele lor DirectMusic, deci nu uitați că (sau cel puțin, reîncărcați această pagină).

Funcția vPlaySound ()

Programul de probă se ocupă de evenimente butonul mouse-ului și apeluri la stânga pentru fiecare vPlaySound funcția () eveniment. de prelucrare a evenimentului are funcția fnMessageProcessor (). dar codul de interes este efectuată în funcția de redare audio. Să ne uităm la codul pentru această funcție:

Funcția vPlaySound () este foarte simplu. De fapt, ea constă dintr-o singură funcție de apel IDirectMusicPerformance8 :: PlaySegmentEx ().

reproducere a sunetului

Funcția PlaySegmentEx () începe redarea segmentului încărcat. Ea are mai multe opțiuni, dar după cum puteți vedea în codul din exemplul meu valoarea multora dintre ele sunt egale cu NULL. Iată prototipul funcției:

Primul parametru, Psursă. un pointer la interfața obiectului reprodus. În programul analizat am folosi un pointer la nivel mondial pentru segmentul, care a fost efectuat înainte de încărcare.

Al doilea parametru, pwzSegmentName. în DirectX 9.0 nu este utilizat.

Al treilea parametru, pTransition. Acesta vă permite să specificați segmentul de modulare. Eu trec NULL pentru acest parametru.

Al patrulea parametru, dwFlags. Acesta vă permite să specificați un set de steaguri care definesc diferitele opțiuni de redare. În exemplu, acest parametru am folosi steaguri DMUS_SEGF_DEFAULT și DMUS_SEGF_SECONDARY. Aceste steaguri indică faptul că segmentul este reprodus în limitele sale prestabilite, iar segmentul este redat ca un sunet secundar. Sunt disponibile multe alte steaguri, și vă încurajez să le caute în documentația DirectX SDK.

Al cincilea parametru, i64StartTime. Acesta stabilește timpul de pornire pentru segment. Eu trec NULL pentru acest parametru pentru redarea audio începe imediat.

A șaptea opțiune, pFrom. Acesta vă permite să specificați interfața pentru a opri redarea atunci când începe un segment nou. Aici am trece, de asemenea NULL.

Al optulea parametru, pAudioPath. Acesta spune sistemul pe care calea audio este utilizat pentru segmentul de redare. Sunt presupunând această valoare NULL este utilizat pentru redarea audio în mod implicit calea.

Acum, rulați programul și apăsați de câteva ori pe fereastra ei, butonul stânga al mouse-ului. O caracteristică importantă a programului este că acesta poate juca simultan mai multe sunete. Acest lucru nu se poate face de mult o impresie pe tine, dacă nu ați angajat în sunetul de redare, dar încredere în mine - este foarte cool. Remarcabil, DirectMusic pentru tine de a efectua toate tamponarea necesare.