Programozás delphi-on és nem csak - multimédiás blogarchívum vezérlés vagy funkciók alatt

Ez a cikk a mcmSendString függvényt tárgyalja, amely a winmm.dll könyvtárban található. Ez a funkció minden MCI (Media Control Interface) eszközre adhat parancsokat (támogatott médiamegjelölés: WAV, MIDI, CDAudio, Video stb.).
Itt van a szintaxisa:
MCIERROR mciSendString (
LPCTSTR lpszCommand,
LPTSTR lpszReturnString,
UINT cchReturn,
HANDLE hwndCallback
);
lpszCommand - parancs;
lpszReturnString - az eredmény karakterlánc;
cchReturn - a méret az eredményhordozó karaktereiben;
hwndCallback egy visszavonási ablak (csak akkor használható, ha az "értesítés" jelző az első paraméterben van beállítva).
Minden további példát Delphi-ban írnak, de szerintem nem lesz nehéz más nyelvekre lefordítani.
Most egyetértünk a mciSendString paraméterekkel a következő példákban:

HwndCallback: 0 lesz;

CchReturn: lesz állítva a 64 (a MSDN meg van írva, hogy ez a maximális hossza egy hiba, hogy vissza lehet paraméter lpszReturnString);

LpszReturnString: ebben a paraméterben a sbReturn: array [1..64] változót használjuk;

Ideje eljutni a funkció legfontosabb paraméteréhez - az lpszCommand. Ez a parancs speciális operátorok segítségével készül, amelyek közül néhányat az alábbiakban tárgyalunk.

nyílt
Ezt a parancsot minden eszköz támogatja. A készülék inicializálására szolgál. Parancs szintaxisa:
'nyitott lpszDeviceID lpszOpenFlags lpszFlags'
lehetőségek:
Az LpszDeviceID a System.ini fájl [MCI] szakaszában vagy a rendszerleíró adatbázisban regisztrált egyik eszköz (vagy annak aliasja) azonosítója. Jelezheti a vezetőt is. Például: cdaudio, sequencer, waveaudio, MyDriver.drv.
Az LpszOpenFlags olyan zászló, amely további eszközinicializáló paramétereket határoz meg. Nem adom meg a paraméterek teljes listáját az egyes eszközökre vonatkozóan, de csak az "alias device_alias type device_type" értéket említem meg, amely az eszköz_ípus típusának eszközeit megnyitja az alias device_alias alatt.
LpszFlags - a következő értékek valamelyikét veheti igénybe:

  1. Teszt - meghatározza a parancs végrehajtásának képességét, miközben maga a parancs nem kerül elküldésre az eszközre.
  2. Várjon - ezzel a zászlóval a programvezérlést csak a parancs végrehajtása után továbbítják.
  3. Értesítés - ezzel a zászlóval a program egy speciális üzenetet kap, amellyel megismerheti a parancs befejezését, és az ellenőrzés késedelem nélkül továbbítható.

például:
mciSendString ('nyitott d: \ Sound.wav típus waveaudio alias MyWave wait', nil, 0, 0); - A WaveAudio eszközt a MyWave alias alatt csatlakoztatja a d: \ Sound.wav fájlhoz.

játszik
Ez a parancs elindítja a lejátszást az alábbi eszközök egyikéhez: CD audio, digitális video, MIDI szekvencer, videodiszk, videomagnó és hullámforma-hang.
Parancs szintaxisa:
'play lpszDeviceID lpszPlayFlags lpszFlags'
lehetőségek:

  • Az LpszDeviceID a System.ini fájl [MCI] szakaszában regisztrált egyik eszköz (vagy annak aliasja) azonosítója. Például: cdaudio, sequencer, waveaudio, avivideo.
  • LpszPlayFlags - egy zászló, amely meghatározza az eszköz lejátszásának típusát. Az 1. táblázat felsorolja ezen paraméterek értékeit minden egyes eszköz esetében, és a 2. táblázat magyarázatot ad ezekre az értékekre.

például:
mciSendString ('play cdaudio', nil, 0, 0); - A zenei CD kezdete vagy a "Szünet" parancs által rögzített pozíciótól indul.

állapot
Ez a parancs különböző paraméterek meghatározására szolgál. Sok paraméter létezik, ezért nem adom meg mindegyiket. Csak a zenei CD-k parancsára fogok összpontosítani.

  • cdaudio típusú track number - a sávszám számának meghatározásához
  • aktuális sáv - az aktuális sáv számának meghatározása - a lemezhosszúság számának hosszának meghatározása - a számhoz tartozó számok számának meghatározása - annak meghatározása érdekében, hogy a lemez CD-ROM módban van-e - a lejátszási állapot meghatározása: lejátszás, leállítás, szüneteltetés, nyitás , nem kész, parkolt, felvétel vagy keres.
  • a számok számának meghatározása - a lemez pozíciójának számának meghatározása - a lemez pozíciójának számának aktuális pozíciójának meghatározása - a sáv számának kezdeti pozíciójának meghatározása kész - visszatéríti a valós értéket, ha a készülék más parancsokat is kaphat Kezdő pozíció - a lemez kezdeti pozíciója
  • időformátum - az eszközön való használathoz használt időformátum.

Ez az elmélettel zárul, és a gyakorlat felé fordul. A mciSendString funkció segítségével zenelejátszót írunk le. Természetesen nem vettük figyelembe az összes szükséges parancsot, de úgy gondolom, hogy nem lesz probléma, mert A többi csapat meglehetősen egyszerűen használható.
Hozzon létre egy új projektet a Delphi-ban, és vigye be az űrlapot a kívánt nézetbe (lásd 1. ábra).

Erre a célra, a következő összetevők szükségesek: TLabel (5 db), TButton (7 db), TListBox, TTrackBar és TTimer. MMS-rendszer hozzáadása a modulok listájához. Most nyilvánítson két globális változót:
var
sbReturn: array [1..64] char; // a visszatérési értékekhez
com: pchar; // a küldendő parancs

Ezután írhatunk funkciókat a lejátszás vezérléséhez:
// menjen a Track number Track-ra
procedure gototrack (Pálya: egész szám);
var
com: pchar;
kezdődik
// állítsa be az időformátumot a "Track: Percek: Seconds: Frames"
com: = 'állítsa be a cdaudio időformátumot tmsf';
mciSendString (com, @sbReturn, 64, 0);
// a track lejátszása
com: = pchar ('play cdaudio from' + inttostr (pálya));
mciSendString (com, @sbReturn, 64, 0);
// állítsa be az időformátumot milliszekundumban
com: = 'set cdaudio idő formátum ms';
mciSendString (com, @sbReturn, 64, 0);
végén;

// lépjen a következő dalra
eljárás NextTrack;
var
cur: egész szám;
kezdődik
cur: = GetCurrentTrack;
// ha az aktuális dal az utolsó, akkor menj az elsőhöz
ha (igaz <>majd
GoToTrack (cur + 1)
más
GoToTrack (1);
végén;

// ugrás az előző dalra
PrevTrack eljárás;
var
cur: egész szám;
kezdődik
cur: = getcurrentTrack;
ha (cur> 1) akkor
GoToTrack (cur-1)
// ha az aktuális sáv az első, akkor ugorjon az utolsóhoz
más
GoToTrack (GetTracksCnt);
végén;

// összetétel hossza
funkció GetTrackLength (pálya: egész): string;
kezdődik
com: = pchar ('status cdaudio length track' + inttostr (sáv) + 'wait');
mciSendString (com, @sbReturn, 64, 0);
eredmény: = trim (sbReturn);
végén;

// a lemez hossza
funkció GetCDLength: string;
kezdődik
com: = pchar ('status cdaudio length wait');
mciSendString (com, @sbReturn, 64, 0);
eredmény: = trim (sbReturn);
végén;

// lejátszási állapot
function GetStatus: string;
kezdődik
com: = 'status cdaudio mód várakozás';
mciSendString (com, @sbReturn, 64, 0);
eredmény: = trim (sbReturn);
végén;

// van egy lemez
függvény IsCDReady: string;
kezdődik
com: = 'status cdaudio kész várakozás';
mciSendString (com, @sbReturn, 64, 0);
eredmény: = trim (sbReturn);
végén;

// Lejátszás leállítása
StopCD;
kezdődik
mciSendString ('stop cdaudio wait', @sbReturn, 64, 0);
végén;

// a készítmény kezdeti helyzete
funkció GetTrackPos (Pálya: szó): string;
kezdődik
com: = pchar ('status cdaudio position track' + inttostr (pálya) + 'wait');
mciSendString (com, @sbReturn, 64, 0);
eredmény: = trim (sbReturn);
végén;

// a lemez aktuális pozíciója
function GetCDPos: string;
kezdődik
com: = pchar ('status cdaudio pozíció vár');
mciSendString (com, @sbReturn, 64, 0);
eredmény: = trim (sbReturn);
végén;

És most írja meg a kezelőket a különböző eseményekért az összetevők számára:
// inicializálja az eszközt indításkor
eljárás TForm1.FormCreate (Feladó: TObject);
kezdődik
mciSendString ('open cdaudio', @sbReturn, 64, 0);
végén;

// kilépéshez zárja be az eszközt
eljárás TForm1.FormDestroy (Sender: TObject);
kezdődik
mciSendString ('close cdaudio wait', @sbReturn, 64, 0);
végén;

// Következő gomb
eljárás TForm1.Button4Click (Sender: TObject);
kezdődik
NextTrack;
végén;

// gomb Prev (ugrás az előző zeneszámra)
eljárás TForm1.Button5Click (Sender: TObject);
kezdődik
PrevTrack;
végén;

// időzítő eljárás, másodpercenként
eljárás TForm1.Timer1Timer (Sender: TObject);
var
cur, i: szó;
st: string;
cnt: byte;
óra: szó;
perc, másodperc: byte;
t: egész szám;
kezdődik
// megjeleníti a lejátszási állapotot
label5.Caption: = 'Állami:' + GetStatus;
ha (GetStatus <>"játék") és
(Állap.info<>"megállt") és
(Állap.info<>'szüneteltetett'), majd kilép;
// állítsa be az időformátumot milliszekundumban
com: = 'állítsa be a cdaudio időformátumot ms wait';
mciSendString (com, @sbReturn, 64, 0);
cur: = GetCurrentTrack;
// válassza ki az áramot
ListBox1.ItemIndex: = cur-1;

com: = 'status cdaudio időformátum várakozás';
mciSendString (com, @sbReturn, 64, 0);
// output információinformációk
label2.Caption: = 'Időformátum:' + trim (sbReturn);
címke3.Caption: = 'Kezdő pozíció:' + GetTrackPos (cur);
label4.Caption: = 'Aktuális pozíció:' + GetCDPos;

TrackBar1.Max: = szakasz (GetTrackLength (cur)) div 1000;
t: = strtoint (GetCDPos) -strtoint (GetTrackPos (cur));
t: = t div 1000;
TrackBar1.Position: = t;
óra: = t div 3600;
t: = t mod 3600;
min: = t div 60;
t: = t mod 60;
sec: = t;
st: = formátum ('.:.', [min, sec]);
ha (óra> 0) akkor
st: = inttostr (óra) + ':' + st;
// megjeleníti az aktuális dal lejátszási idejét
label1.Caption: = st;
végén;

// ha duplán kattint a listán szereplő dalra, elkezdjük lejátszani
eljárás TForm1.ListBox1DblClick (Sender: TObject);
kezdődik
GoToTrack (ListBox1.ItemIndex + 1);
végén;

/ A dal visszacsévélése 5 másodpercig
eljárás TForm1.Button6Click (Sender: TObject);
var
t: egész szám;
kezdődik
t: = szakasz (GetCDPos) +5000;
StopCD;
com: = pchar ('kérdezd a' + inttostr (t) + 'wait' szót);
mciSendString (com, @sbReturn, 64, 0);
PlayCD;
végén;

// A dal 5 másodpercre történő visszacsévélése
eljárás TForm1.Button7Click (Sender: TObject);
var
t: egész szám;
kezdődik
t: = strtoint (GetCDPos) -5000;
StopCD;
com: = pchar ('kérdezd a' + inttostr (t) + 'wait' szót);
mciSendString (com, @sbReturn, 64, 0);
PlayCD;
végén;

Helló Nagyon köszönöm. Csak írtam a cikket (pontosabban másoltam magam további ismerősnek =)), de még első pillantásra is nagyon informatív és olvasható! (különösen, ha Alexei Nikolayevics Rodionov írja, hogy "Cool!", akkor határozottan tetszik))))
Csak írtam egy rövid időtartamú papírt a hangfeldolgozásról, és nagyon köszönöm.

A DirectX szintén nem akart (még) használni.

Ezt követően megtaláltam az mciSendString általános leírását, de példák nélkül nem volt egyértelmű:

Köszönjük ismét! Következő magam

Csodálatos csapat és elegáns példa. Tud valaki más megmondani, hogy megváltoztathatja-e a lejátszani kívánt hangerőt. Én magam nem találtam valamit.

Az MCI eszköz nem található wav fájl lejátszásakor
Megoldhatnám ezt valahogy?