Главная » Программирование звука » Пример приложения Windows

0

Предлагаемый  ниже  пример  специально  сделан  простым.  Я  не  стал  заниматься разработкой изощренного графического интерфейса, вместо этого я подготовил простое консольное приложение. Его можно запускать из окна MS DOS и использовать  для  воспроизведения  произвольного  числа  файлов  (в  пакетном  режиме) или запустить из-под Windows (в интерактивном режиме).

B  интерактивном  режиме  используется  стандартная  диалоговая  панель,  с  помощью  которой вы  можете  выбрать  файл  для  проигрывания.  B пакетном режиме воспроизводятся файлы, указанные в командной строке.

Листинг 6.4. Программа winmain.cpp

#include <fstream>

#include "audio.h"

#include "open.h"

#include "aplayer.h"

#include "winplayr.h"

#include <commdlg.h>

#include <winbase.h>

#include <crtdbg.h>

#include <cassert>

int main(int argc, char **argv) {

// Для  проведения тестов  можно  смонтировать несколько  файлов,

// сняв  с  этих  строк  комментарий и  изменив  их:

// Batch("C:\\samples\\*.*");

// exit(0);

if (argc == 1) Interactive();

else {

while (–argc) Batch(*++argv);

}

return 0;

}

Заметим,  что  различить,  в  каком  режиме  запущена  программа,  очень  просто: если в командной строке нет аргументов, значит, программа запущена в интерактивном  режиме.  Работа  в  интерактивном  режиме  организована  путем  повторяющихся  вызовов  метода  GetOpenFileName,  с  помощью  которого  у  пользователя запрашиваются имена файлов.

Листинг 6.5. Воспроизведение файлов под Windows в интерактивном режиме

void Interactive() {

while (1) { OPENFILENAME ofn;

char fileName[512] = ""; memset(&ofn,0,sizeof(ofn)); ofn.lStructSize = sizeof(OPENFILENAME); ofn.lpstrFile = fileName;

ofn.lpstrTitle = "Play Sound File";

ofn.nMaxFile =      512;

if (GetOpenFileName(&ofn)) // Отбрасываем  диалог.

PlayFile(fileName);

else return;

}

}

Работа в пакетном режиме несколько сложнее. B Windows, как и в MS-DOS, обработка групповых символов должна быть реализована непосредственно  в приложении. Отобрать все файлы, соответствующие заданному образцу, вам помогут системные функции FindFirstFile, FindNextFile и FindClose.

Листинг 6.6. Воспроизведение файлов под Windows

в неинтерактивном режиме

void Batch(char *filePattern) { WIN32_FIND_DATA fileData; bool finished = false;

HANDLE hSearch = FindFirstFile(filePattern,&fileData);

if (hSearch == INVALID_HANDLE_VALUE) {

cerr << "Can’t find " << filePattern << "\n";

finished = true;

}

while (!finished) {

// Пропускаем директории, в  особенности  "." и  "..".

if (!(fileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) {

char fileName[2048];

strcpy(fileName,filePattern);

char *p=fileName + strlen(fileName) 1;

while ((p > fileName) && (*p != "W") && (*p != "/"))

p–; strcpy(р+1,fileData.cFileName); PlayFile(fileName);

}

finished = !FindNextFile(hSearch,&fileData);

}

FindClose(hSearch);

}

Непосредственно  для  воспроизведения  файла  из  обеих  вышеуказанных  функций  вызывается  функция  PlayFile.  Обратите  внимание  на  то,  что  входной файл  открывается  с  использованием  флага  ios::binary.  Это  необходимо  для правильной обработки двоичных файлов, к которым относятся и файлы с записью звука.

Листинг 6.7. Воспроизведение отдельного файла из-под Windows

void PlayFile(char *fileName) {

// Сообщаем  имя   файла.

cerr << "File: " << fileName << "\n"; ifstream input(fileName,ios::in|ios::binary); if (!input.is_open()) {

// He удалось  открыть файл   <имя   файла>.

cerr << "Couldn’t open file " << fileName << "\n";

return;

}

AudioAbstract *audioFile = OpenFormat(input);

if (audioFile) {

WinPlayer player(audioFile);

player.Play();

delete audioFile;

// Закончено воспроизведение  файла. cerr << "Finished playing " << fileName << ".\n";

}

cerr << "\n";

// Параноидальная проверка целостности

// области памяти.

assert(_CrtCheckMemory());

}

Источник: Кинтцель Т.  Руководство программиста по работе со звуком = A Programmer’s Guide to Sound: Пер. с англ. М.: ДМК Пресс, 2000. 432 с, ил. (Серия «Для программистов»).

По теме:

  • Комментарии