У даній статті розглядається функція mciSendString, яка знаходиться в бібліотеці winmm.dll. Ця функція може подавати команди будь-якого MCI (Media Control Interface) пристрою (підтримуване системою мультимедіа пристрій: WAV, MIDI, CDAudio, Video і т.п.).
Ось її синтаксис:
MCIERROR mciSendString (
LPCTSTR lpszCommand,
LPTSTR lpszReturnString,
UINT cchReturn,
HANDLE hwndCallback
);
lpszCommand - команда;
lpszReturnString - рядок результату;
cchReturn - розмір в символах рядка результату;
hwndCallback - вікно відкликання (використовується тільки при встановленому в першому параметрі прапора "notify").
Всі подальші приклади будуть написані на Delphi, але їх переклад на інші мови, я думаю, не складе особливих труднощів.
Тепер домовимося з параметрами функція mciSendString в наступних прикладах:
HwndCallback: буде приймати значення 0;
CchReturn: буде приймати значення 64 (в MSDN написано, що це максимальна довжина помилки, яка може бути повернута параметром lpszReturnString);
LpszReturnString: в цьому параметрі будемо використовувати змінну sbReturn: array [1..64] of char;
Прийшов час перейти до найголовнішого параметру функції - lpszCommand. Ця команда складається за допомогою спеціальних операторів, частина яких розглядається далі.
Open
Ця команда підтримується усіма пристроями. Вона служить для його запуску. Синтаксис команди:
'Open lpszDeviceID lpszOpenFlags lpszFlags'
параметри:
LpszDeviceID - ідентифікатор одного з пристроїв (або його псевдонім), прописаних в розділі [MCI] файлу System.ini або в реєстрі. Може вказувати також на драйвер. Наприклад: cdaudio, sequencer, waveaudio, MyDriver.drv.
LpszOpenFlags - прапор, який визначає додаткові параметри запуску. Я не буду приводити весь список значень цього параметра для кожного пристрою, а згадаю лише значення "alias device_alias type device_type", яке відкриває пристрій типу device_type під псевдонімом device_alias.
LpszFlags - може приймати одне з наступних значень:
- Test - служить для визначення можливості виконання команди, при цьому сама команда пристрої не відправляється.
- Wait - при цьому прапорі управління програмою передається тільки після виконання команди.
- Notify - при цьому прапорі програма отримає спеціальне повідомлення, за допомогою якого зможе дізнатися про завершення виконання команди, а управління передається без зволікання.
приклад:
mciSendString ( 'open d: \ Sound.wav type waveaudio alias MyWave wait', nil, 0, 0); - пов'язує пристрій WaveAudio під псевдонімом MyWave з файлом d: \ Sound.wav.
Play
Ця команда запускає програвання для одного з наступних пристроїв: CD audio, digital-video, MIDI sequencer, videodisc, VCR, і waveform-audio.
Синтаксис команди:
'Play lpszDeviceID lpszPlayFlags lpszFlags'
параметри:
- LpszDeviceID - ідентифікатор одного з пристроїв (або його псевдонім), прописаних в розділі [MCI] файлу System.ini. Наприклад: cdaudio, sequencer, waveaudio, avivideo.
- LpszPlayFlags - прапор, який визначає тип програвання пристрою. У Таблиці 1 наведено список значень цього параметра для кожного пристрою, а в Таблиці 2 наведені пояснення для цих значень.
приклад:
mciSendString ( 'play cdaudio', nil, 0, 0); - музичний компакт-диск починає програватися або з початку, або з позиції, зафіксованої командою "Пауза".
Status
Дана команда служить для визначення різних параметрів. Параметрів багато, тому всі їх наводити не буду. Зупинюся лише на командах для музичних компакт-дисків.
- cdaudio type track number - для визначення типу доріжки з номером number
- current track - для визначення номера поточної композиції length - для визначення довжини диска length track number - для визначення довжини композиції з номером number media present - для визначення наявності диска в CD-ROM mode - для визначення стану програвання: playing, stopped, paused, open , not ready, parked, recording або seeking.
- number of tracks - для визначення кількості доріжок на диску position - для визначення поточної позиції диска position track number - для визначення початкової позиції доріжки з номером number ready - повертає істину, якщо пристрій може приймати інші команди start position - початкова позиція диска
- time format - формат часу, який використовується в даній сесії роботи з пристроєм.
На цьому закінчимо з теорією і перейдемо до практики. Напишемо за допомогою функції mciSendString програвач музичних компакт-дисків. Звичайно, ми розглянули не всі команди, які нам знадобляться, але, я думаю, що проблем не виникне, тому що інші команди досить прості у вжитку.
Створіть в Delphi новий проект і приведіть форму до потрібного вигляду (див. Рис.1).
Для цього знадобляться наступні компоненти: TLabel (5 штук), TButton (7 штук), TListBox, TTrackBar і TTimer. До списку модулів додайте MMSystem. Тепер оголосіть дві глобальні змінні:
var
sbReturn: array [1..64] of char; // для значень, що повертаються
com: pchar; // посилається команда
Після цього можна писати функції для управління програванням:
// перехід до доріжці з номером Track
procedure gototrack (Track: integer);
var
com: pchar;
begin
// установка формату часу в "Доріжка: Хвилини: Секунди: Фрейми"
com: = 'set cdaudio time format tmsf';
mciSendString (com, @sbReturn, 64, 0);
// починаємо програвання доріжки Track
com: = pchar ( 'play cdaudio from' + inttostr (Track));
mciSendString (com, @sbReturn, 64, 0);
// встановлюємо формат часу в мілісекунди
com: = 'set cdaudio time format ms';
mciSendString (com, @sbReturn, 64, 0);
end;
// перехід до наступної пісні
procedure NextTrack;
var
cur: integer;
begin
cur: = GetCurrentTrack;
// якщо поточна композиція - остання, то переходимо до першої
if (cur <>then
GoToTrack (cur + 1)
else
GoToTrack (1);
end;
// перехід до попередньої композиції
procedure PrevTrack;
var
cur: integer;
begin
cur: = getcurrentTrack;
if (cur> 1) then
GoToTrack (cur-1)
// якщо поточна композиція - перша, то переходимо до останньої
else
GoToTrack (GetTracksCnt);
end;
// довжина композиції
function GetTrackLength (Track: integer): string;
begin
com: = pchar ( 'status cdaudio length track' + inttostr (Track) + 'wait');
mciSendString (com, @sbReturn, 64, 0);
result: = trim (sbReturn);
end;
// довжина диска
function GetCDLength: string;
begin
com: = pchar ( 'status cdaudio length wait');
mciSendString (com, @sbReturn, 64, 0);
result: = trim (sbReturn);
end;
// статус програвання
function GetStatus: string;
begin
com: = 'status cdaudio mode wait';
mciSendString (com, @sbReturn, 64, 0);
result: = trim (sbReturn);
end;
// чи є диск
function IsCDReady: string;
begin
com: = 'status cdaudio ready wait';
mciSendString (com, @sbReturn, 64, 0);
result: = trim (sbReturn);
end;
// Зупинити програвання
procedure StopCD;
begin
mciSendString ( 'stop cdaudio wait', @sbReturn, 64, 0);
end;
// початкова позиція композиції
function GetTrackPos (Track: word): string;
begin
com: = pchar ( 'status cdaudio position track' + inttostr (Track) + 'wait');
mciSendString (com, @sbReturn, 64, 0);
result: = trim (sbReturn);
end;
// поточна позиція диска
function GetCDPos: string;
begin
com: = pchar ( 'status cdaudio position wait');
mciSendString (com, @sbReturn, 64, 0);
result: = trim (sbReturn);
end;
А тепер напишемо обробники різних подій для компонентів:
// инициализируем пристрій при завантаженні
procedure TForm1.FormCreate (Sender: TObject);
begin
mciSendString ( 'open cdaudio', @sbReturn, 64, 0);
end;
// при виході закриваємо пристрій
procedure TForm1.FormDestroy (Sender: TObject);
begin
mciSendString ( 'close cdaudio wait', @sbReturn, 64, 0);
end;
// кнопка Next (наступна композиція)
procedure TForm1.Button4Click (Sender: TObject);
begin
NextTrack;
end;
// кнопка Prev (перехід до попередньої композиції)
procedure TForm1.Button5Click (Sender: TObject);
begin
PrevTrack;
end;
// процедура для таймера, що повторюється кожну секунду
procedure TForm1.Timer1Timer (Sender: TObject);
var
cur, i: word;
st: string;
cnt: byte;
hour: word;
min, sec: byte;
t: integer;
begin
// виводимо стан програвання
label5.Caption: = 'Стан:' + GetStatus;
if (GetStatus <>'Playing') and
(GetStatus<>'Stopped') and
(GetStatus<>'Paused') then exit;
// встановлюємо формат часу в мілісекунди
com: = 'set cdaudio time format ms wait';
mciSendString (com, @sbReturn, 64, 0);
cur: = GetCurrentTrack;
// виділяємо в списку композицій поточну
ListBox1.ItemIndex: = cur-1;
com: = 'status cdaudio time format wait';
mciSendString (com, @sbReturn, 64, 0);
// виводимо інформацію інформацію
label2.Caption: = 'Формат часу:' + trim (sbReturn);
label3.Caption: = 'Початкова позиція:' + GetTrackPos (cur);
label4.Caption: = 'Поточна позиція:' + GetCDPos;
TrackBar1.Max: = strtoint (GetTrackLength (cur)) div тисячу;
t: = strtoint (GetCDPos) -strtoint (GetTrackPos (cur));
t: = t div 1000;
TrackBar1.Position: = t;
hour: = t div 3600;
t: = t mod 3600;
min: = t div 60;
t: = t mod 60;
sec: = t;
st: = format ( '.:.', [min, sec]);
if (hour> 0) then
st: = inttostr (hour) + ':' + st;
// виводимо час програвання поточної композиції
label1.Caption: = st;
end;
// при подвійному натисканні на пісню зі списку починаємо її програвання
procedure TForm1.ListBox1DblClick (Sender: TObject);
begin
GoToTrack (ListBox1.ItemIndex + 1);
end;
// перемотування композиції на 5 секунд вперед
procedure TForm1.Button6Click (Sender: TObject);
var
t: integer;
begin
t: = strtoint (GetCDPos) +5000;
StopCD;
com: = pchar ( 'seek cdaudio to' + inttostr (t) + 'wait');
mciSendString (com, @sbReturn, 64, 0);
PlayCD;
end;
// перемотування композиції на 5 секунд назад
procedure TForm1.Button7Click (Sender: TObject);
var
t: integer;
begin
t: = strtoint (GetCDPos) -5000;
StopCD;
com: = pchar ( 'seek cdaudio to' + inttostr (t) + 'wait');
mciSendString (com, @sbReturn, 64, 0);
PlayCD;
end;
Добрий день. Велике спасибі. Пишу тільки-тільки глянувши на статтю (точніше скопіювавши собі для подальшого ознайомлення =)), але навіть на перший погляд дуже інформативна і легкий для читання! (Тим більше, якщо Олексій Миколайович Родіонов пише, що «Класно!», То мені точно сподобається))))
Я як раз пишу курсову роботу по обробці звука.Спасібо велике.
DirectX теж не хотілося використовувати (поки).
Далі знайшов загальний опис по mciSendString, але було не зрозуміло без прикладів:
Ще раз дякую! далі сам
Чудова команда і приклад шикарний. Може хто-небудь ще підкаже чи можна поміняти гучність відтвореного звуку. Сам я щось не знайшов.
Видає помилку пристрій MCI, не знайдено при відтворенні wav файлу
Можна як-небудь це виправити?