Урок 41 Управление CD-ROM'ом No title

May 22, 2007
в колонках играет Аквариум - Radio Silence


Как программно управлять CD-ROM'ом

Для начала определим вспомогательные переменные и функции, которые облегчат передачу команд:
//Заранее говорю, что библиотеку "winmm.lib" придется поискать, если найдем выложим на сайте.

#include <mmsystem.h>
#include <stdio.h>
#pragma comment(lib,"winmm.lib")

/* Команды */

char * CdCmdSet = "set";//Ожидание (при открытии CD-ROM'а)
char * CdCmdStatus = "status";//Статус
char * CdCmdPlay = "play";//Воспроизведение
char * CdCmdPause = "pause";//Приостановить воспроизведение
char * CdCmdStop = "stop";//Остановить воспроизведение
char * CdCmdResume = "resume";//Воспроизведение

/* Флаги команд */

char * CdCmdFlagOpen = "door open";//Открыть
char * CdCmdFlagClose = "door closed";//Закрыть
char * CdCmdCurTrack = "current track";//Слудующий трэк
char * CdCmdCurMode = "mode";//Варианты
char * CdCmdFlagEmpty = "";//

/* Флаги выполнения */
char * CdFlagWait = "wait";//Ожидание
char * CdFlagEmpty = "";

/* Буфер, в котором будем создавать команды */
char CdCommandBuffer[256];

/* Создание команды без указания имени CD-ROM'а */
char * CreateCdCommand(char * pBuffer, char * pCommand, char * pCmdFlags, char * pFlags) {
sprintf(pBuffer,"%s cdaudio %s %s",pCommand,pCmdFlags,pFlags);
return pBuffer;
}

/* Создание команды с указанием имени CD-ROM'а */
char * CreateCdCommandEx(char * pBuffer, char DriveLetter, char * pCommand, char * pCmdFlags, char * pFlags) {
sprintf(pBuffer,"%s cdaudio!%c: %s %s",pCommand,DriveLetter,pCmdFlags,pFlags);
return pBuffer;
}

Теперь, используя вспомогательные функции и переменные, отдавать команды управления CD-ROM'ом не просто, а очень просто.

1. Открыть CD-ROM, ожидая выполнения этой команды:

mciSendStringA(CreateCdCommand(CdCommandBuffer,CdCmdSet,CdCmdFlagOpen,CdFlagWait),
NULL,
0,
INVALID_HANDLE_VALUE);

2. Закрыть CD_ROM, ожидая выполнения этой команды:

mciSendStringA(CreateCdCommand(CdCommandBuffer,CdCmdSet,CdCmdFlagClose,CdFlagWait),
NULL,
0,
INVALID_HANDLE_VALUE);

3. Начать воспроизведение без ожидания выполнения:

mciSendStringA(CreateCdCommand(CdCommandBuffer,CdCmdPlay,CdCmdFlagEmpty,CdFlagEmpty),
NULL,
0,
INVALID_HANDLE_VALUE);

4. Приостановить воспроизведение(пауза) без ожидания выполнения:

mciSendStringA(CreateCdCommand(CdCommandBuffer,CdCmdPause,CdCmdFlagEmpty,CdFlagEmpty),
NULL,
0,
INVALID_HANDLE_VALUE);

5. Возобновить воспроизведение без ожидания выполнения:

mciSendStringA(CreateCdCommand(CdCommandBuffer,CdCmdResume,CdCmdFlagEmpty,CdFlagEmpty),
NULL,
0,
INVALID_HANDLE_VALUE);

6. Остановить воспроизведение(стоп) без ожидания выполнения:

mciSendStringA(CreateCdCommand(CdCommandBuffer,CdCmdStop,CdCmdFlagEmpty,CdFlagEmpty),
NULL,
0,
INVALID_HANDLE_VALUE);

7. Получить номер текущей дорожки, ожидая выполнения этой команды:

mciSendStringA(CreateCdCommand(CdCommandBuffer,CdCmdStatus,CdCmdCurTrack,CdFlagWait),
CdCommandBuffer,
255,
INVALID_HANDLE_VALUE);
ShowMessage("Current track is "+AnsiString(CdCommandBuffer));

8.Получить текущее состояние, ожидая выполнения этой команды:

mciSendStringA(CreateCdCommand(CdCommandBuffer,CdCmdStatus,CdCmdCurMode,CdFlagWait),
CdCommandBuffer,
255,
INVALID_HANDLE_VALUE);
ShowMessage("Current mode is \'"+AnsiString(CdCommandBuffer)+"\'");

Если в системе присутствует несколько приводов CD, то для задания конкретного привода вместо функции CreateCdCommand следует использовать CreateCdCommandEx

 


Author of article - Maks  2007
www.builderhelper.org
builder.helper@rambler.ru