Мультимедиа для Windows




Глава 2. Запись и воспроизведение звука


    2. Запись и воспроизведение звука
    2. Запись и воспроизведение звука 2.1. Самые простые способы воспроизведения звука 2.2. Интерфейс управляющих строк MCI 2.3. Интерфейс управляющих сообщений MCI 2.4. Интерфейс низкого уровня В это...
    2.1. Самые простые способы воспроизведения звука
    2.1. Самые простые способы воспроизведения звука В самом простейшем случае приложение должно уметь выдавать звуковые сигналы или проигрывать небольшие звуковые сообщения при появлении каких-либо н...
    Функция MessageBeep
    Функция MessageBeep Ранее, в предыдущих томах Библиотеки системного программиста, мы упоминали функцию MessageBeep : void MessageBeep(UINT uAlert); Эта функция как раз и предназначена для выдачи з...
    Функция sndPlaySound
    Функция sndPlaySound А есть ли простой способ проигрывания произвольного wav-файла? Есть, и он действительно прост. Этот способ основан на использовании функции sndPlaySound , которая находится в...
    Приложение SNDPLAY
    Приложение SNDPLAY Наше первое приложение SNDPLAY, имеющее зачатки мультимедиа, предназначено для демонстрации различных способов работы с функцией sndPlaySound (листинг 2.1). Листинг 2.1. Файл sn...
    2.2. Интерфейс управляющих строк MCI
    2.2. Интерфейс управляющих строк MCI MCI представляет собой универсальный, независимый от особенностей аппаратного обеспечения интерфейс, предназначенный для управления устройствами мультимедиа, т...
    Использование интерфейса управляющих строк
    Использование интерфейса управляющих строк Работа с устройствами ввода/вывода системы мультимедиа напоминает работу с обычными файлами в том смысле, что вначале вы открываете устройство, затем вып...
    Команды MCI
    Команды MCI Какие бывают команды? Все команды можно разделить на четыре группы : системные (System), обязательные (Required), базовые (Basic) и расширенные (Extended). Системные команды не передаю...
    Функция mciSendString
    Функция mciSendString Как передать устройству управляющую строку? Очень просто - для этого можно воспользоваться функцией mciSendString . Прототип функции mciSendString находится в файле mmsystem....
    Сообщение MM_MCINOTIFY
    Сообщение MM_MCINOTIFY Немного о сообщении MM_MCINOTIFY . Как мы уже говорили, приложение может передать функции mciSendString через последний параметр идентификатор окна. Если команда MCI выдана...
    Команды инициализации и завершения работы
    Команды инициализации и завершения работы В этой группе всего две команды - open и close, предназначенные, соответственно, для открытия и закрытия устройства ввода/вывода звука....
    open
    open Управляющая строка open посылается перед началом работы для открытия устройства. Эта строка имеет следующий формат: open device [type device_name] [alias alias] [buffer size] [notify] [wait]...
    close
    close Команда close закрывает устройство и освобождает все связанные с ним ресурсы. Формат команды: close device_id [notify] [wait] Необходимо указать идентификатор устройства device_id, использов...
    Справочные команды
    Справочные команды Эта группа команд предназначена для получения различной справочной информации об устройстве. Перед использованием справочных команд следует открыть устройство командой open....
    sysinfo
    sysinfo Команда sysinfo предназначена для получения системной информации об MCI-устройстве: sysinfo device_id parameter [notify] [wait] В качестве параметра parameter можно указывать одну из следу...
    info
    info С помощью команды info можно получить информацию об MCI-устройстве: info device_id parameter [notify] [wait] В качестве параметра parameter можно указывать одну из следующих строк: product Те...
    capability
    capability С помощью команды capability приложение может определить возможности устройства: capability device_id parameter [notify] [wait] В качестве параметра parameter можно указывать одну из сл...
    status
    status Команда status позволяет определить текущее состояние устройства. status device_id parameter [notify] [wait] В качестве параметра parameter можно указывать одну из следующих строк: alignmen...
    Команды установки режима работы
    Команды установки режима работы В этой группе есть две команды - set и break....
    set
    set Команда set в зависимости от параметров позволяет выполнять установку различных режимов работы. set device_id parameter [notify] [wait] В качестве параметра parameter можно указывать одну из с...
    break
    break Команда break позволяет определить код виртуальной клавиши, предназначенной для прерывания (по умолчанию используется комбинация клавиш Control+Break): break device_id parameter [notify] [wa...
    Команды для воспроизведения, записи и позиционирования
    Команды для воспроизведения, записи и позиционирования С помощью команд этой группы можно выполнять запуск воспроизведения или записи, временный или полный останов, позиционирование и т. д....
    play
    play Команда play предназначена для запуска процесса воспроизведения. Она имеет следующий формат: play device_id [from position [to position]] [notify] [wait] Идентификатор устройства device_id со...
    record
    record Эта команда запускает запись звукового фрагмента. В качестве необязательного параметра parameter можно указывать одну из следующих строк: insert Новые данные будут добавлены к ранее записан...
    save
    save Сохранение записанного звукового фрагмента в файле save device_id [filename] [notify] [wait] Параметр filename задает путь к файлу, в который должен быть записан звуковой фрагмент...
    pause
    pause Временный останов при воспроизведении или записи (пауза) pause device_id...
    resume
    resume Продолжение воспроизведения или записи после временного останова по команде pause. resume device_id [notify] [wait]...
    seek
    seek Позиционирование с последующим остановом. Перед использованием этой команды необходимо задать формат времени командой set time format. seek device_id parameter [notify] [wait] В качестве необ...
    cue
    cue Подготовка для записи или воспроизведения. После выполнения такой подготовки устройство будет готово быстро приступить к выполнению требуемой операции. Эту команду нельзя выдавать во время зап...
    delete
    delete Удаление сегмента из фрагмента звуковых данных delete device_id from position [to position] [notify] [wait] Для этой команды можно указать либо оба параметра (from и to), либо только параме...
    Приложение MCISTRVW
    Приложение MCISTRVW Приложение MCISTRVW (листинг 2.4) демонстрирует использование строчного интерфейса MCI для воспроизведения звукового файла с именем kaas.wav, расположенного в текущем каталоге...
    Приложение MCITEST
    Приложение MCITEST В составе системы разработки приложений Microsoft SDK в качестве примера поставляются исходные тексты приложения MCITEST (загрузочный модуль этого приложения есть в каталоге SDK...
    Рис. 2.1. Главное окно приложения MCITEST
    Рис. 2.1. Главное окно приложения MCITEST Окно, расположенное в верхней части экрана, предназначено для ввода командных строк. Это окно представляет собой многострочный редактор текста, поэтому вы...
    2.3. Интерфейс управляющих сообщений MCI
    2.3. Интерфейс управляющих сообщений MCI Интерфейс управляющих сообщений более удобен для приложений, составленных на языках программирования С и С++. Он предполагает посылку устройствам мультимед...
    Функция mciSendCommand
    Функция mciSendCommand Для передачи управляющих сообщений драйверам устройств мультимедиа используется функция mciSendCommand , описание которой приведено ниже. Функция mciSendCommand DWORD mciSen...
    Коды управляющих сообщений MCI
    Коды управляющих сообщений MCI Коды управляющих сообщений делятся на системные (System), обязательные (Required), базовые (Basic) и расширенные (Extended), точно также как и команды, используемые...
    MCI_OPEN
    MCI_OPEN Перед использованием устройства мультимедиа вы должны его открыть, вызвав функцию mciSendCommand и указав ей в качестве второго параметра код команды MCI_OPEN . Первый параметр (идентифик...
    MCI_CLOSE
    MCI_CLOSE Эта команда закрывает устройство. Ее необходимо выдавать после завершения работы с устройством. Для команды MCI_CLOSE используется блок параметров в виде структуры MCI_GENERIC_PARMS , оп...
    MCI_PLAY
    MCI_PLAY Команда MCI_PLAY , как это видно из ее названия, предназначена для проигрывания файлов. Для этой команды в файле mmsystem.h определена структура блока параметров MCI_PLAY_PARMS : typedef...
    MCI_RECORD
    MCI_RECORD Команда MCI_RECORD позволяет выполнить запись в существующий или новый файл. Если при открытии устройства вы указали имя файла, будет выполняться запись в существующий файл. Для записи...
    MCI_SAVE
    MCI_SAVE Команда MCI_SAVE позволяет сохранить результат записи в файле. Для нее используется блок параметров MCI_SAVE_PARMS : typedef struct tagMCI_SAVE_PARMS { DWORD dwCallback; LPCSTR lpfilename...
    MCI_PAUSE
    MCI_PAUSE Команда MCI_PAUSE приостанавливает выполнение операции записи или воспроизведения. Она используется совместно с блоком параметров MCI_GENERIC_PARMS , который был рассмотрен выше. Флаги д...
    MCI_RESUME
    MCI_RESUME Эта команда отменяет действие команды MCI_PAUSE, при этом приостановленная операция будет продолжена. Для команды MCI_RESUME используется блок параметров MCI_GENERIC_PARMS . Флаги для э...
    MCI_STOP
    MCI_STOP Команда MCI_STOP останавливает выполнение операции записи или воспроизведения, после чего освобождает все буфера, которые были использованы для операции. Эта команда использует блок парам...
    MCI_SEEK
    MCI_SEEK Команда MCI_SEEK позволяет выполнять позиционирование в пределах файла. Для этой команды используется блок параметров MCI_SEEK_PARMS : typedef struct tagMCI_SEEK_PARMS { DWORD dwCallback;...
    MCI_BREAK
    MCI_BREAK С помощью команды MCI_BREAK указывается виртуальный код клавиши, предназначенной для прерывания выполнения операции. Для этой команды необходимо использовать следующую структуру блока па...
    MCI_CUE
    MCI_CUE Команда MCI_CUE используется для подготовки устройства к записи или воспроизведению, после которой эти операции выполняются с минимальной задержкой. Для нее используется блок параметров в...
    MCI_GETDEVCAPS
    MCI_GETDEVCAPS С помощью команды MCI_GETDEVCAPS можно определить возможности устройства мультимедиа. Для нее используется блок параметров в формате структуры MCI_GETDEVCAPS_PARMS , определенной в...
    MCI_INFO
    MCI_INFO С помощью этой команды можно получить информацию об устройстве в виде текстовой строки, такую как описание аппаратуры, имя файла, связанного с устройством. Используется блок параметров в...
    MCI_SYSINFO
    MCI_SYSINFO С помощью этой команды можно получить системную информацию об устройстве в виде текстовой строки. Используется блок параметров в формате структуры MCI_SYSINFO_PARMS : typedef struct ta...
    MCI_STATUS
    MCI_STATUS Команда MCI_STATUS используется для определения текущего состояния устройства. Формат соответствующего блока параметров описывается структурой MCI_STATUS_PARMS : typedef struct tagMCI_S...
    MCI_SET
    MCI_SET Команда MCI_SET предназначена для установки режима работы устройства. Вместе с этой командой используется блок параметров в формате структуры MCI_SET_PARMS : typedef struct tagMCI_SET_PARM...
    MCI_COPY
    MCI_COPY Команда MCI_COPY предназначена для копирования данных в универсальный буфер обмена Clipboard. Для нее используется блок параметров в формате структуры MCI_GENERIC_PARMS, флаги MCI_NOTIFY...
    MCI_PASTE
    MCI_PASTE Команда MCI_PASTE вставляет данные из Clipboard в текущий буфер устройства. Для нее, как и для команды MCI_COPY, используется блок параметров в формате структуры MCI_GENERIC_PARMS, флаги...
    MCI_CUT
    MCI_CUT Команда MCI_CUT удаляет данные из текущего буфера устройства и копирует их в универсальный буфер обмена Clipboard. Для нее используется блок параметров в формате структуры MCI_GENERIC_PARM...
    MCI_DELETE
    MCI_DELETE Команда MCI_DELETE удаляет данные из текущего буфера устройства без копирования их в Clipboard. Для нее используется блок параметров в формате структуры MCI_GENERIC_PARMS. Вместе с этой...
    MCI_LOAD
    MCI_LOAD Команда MCI_LOAD предназначена для загрузки файла. Она использует блок параметров в формате структуры MCI_LOAD_PARMS : typedef struct tagMCI_LOAD_PARMS { DWORD dwCallback; LPCSTR lpfilena...
    Приложение MCIWAVER
    Приложение MCIWAVER В качестве примера использования интерфейса сообщений MCI приведем исходные тексты несложного приложения MCIWAVER, с помощью которого можно записывать и воспроизводить wav-файл...
    Рис. 2.2. Главное окно приложения MCIWAVER
    Рис. 2.2. Главное окно приложения MCIWAVER Если выбрать из главного меню приложения строку Record!, включится запись. Вы сможете записать звуковой фрагмент длительностью до 60 секунд (максимальное...
    2.4. Интерфейс низкого уровня
    2.4. Интерфейс низкого уровня При необходимости иметь непосредственный доступ к буферам, содержащим звуковые данные, приложение должно использовать интерфейс низкого уровня, обеспечиваемый несколь...
    Формат wav-файла
    Формат wav-файла Данные, имеющие отношение к мультимедиа (звук, видео и т. п.) хранятся в файлах в так называемом RIFF-формате (Resource Interchange File Format - формат файла для обмена ресурсами...
    Рис. 2.3. Фрагмент "RIFF"
    Рис. 2.3. Фрагмент RIFF Первое двойное слово заголовка содержит четырехбуквенный код FOURCC, который идентифицирует данные, хранящиеся во фрагменте. Второе двойное слово заголовка - размер области...
    Рис. 2.4. Формат wav-файла
    Рис. 2.4. Формат wav-файла Область, обозначенная на рис. 2.4 как Формат данных, описывает звуковые данные. Формат этой области для файлов PCM (записанных с использованием импульсно-кодовой модуляц...
    Функции для работы с файлами
    Функции для работы с файлами Для чтения или записи wav-файлов вы, конечно, можете использовать стандартные функции или такие функции, как _hread или _hwrite. Однако в библиотеке mmsystem.dll есть...
    Открытие файла
    Открытие файла Для открытия файла предназначена функция mmioOpen , прототип которой есть в файле mmsystem.h. Эта функция может открывать файл для буферизованного или небуферизованного ввода, файл...
    Закрытие файла
    Закрытие файла Если приложение открыло файл функцией mmioOpen, после завершения работы с ним оно должно закрыть этот файл функцией mmioClose . Функция mmioClose UINT mmioClose( HMMIO hmmio, // иде...
    Запись в файл
    Запись в файл Для записи в файл, открытый при помощи функции mmioOpen, следует использовать функцию mmioWrite . Эта функция позволяет за один вызов записать в файл блок данных размером, большим 64...
    Чтение из файла
    Чтение из файла Для чтения файла, открытого при помощи функции mmioOpen, следует использовать функцию mmioRead . Эта функция позволяет за один вызов прочитать из файла блок данных размером, больши...
    Позиционирование
    Позиционирование Для позиционирования внутри файла, открытого при помощи функции mmioOpen, следует использовать функцию mmioSeek . Функция mmioSeek LONG mmioSeek( HMMIO hmmio, // идентификатор отк...
    Функции для работы с RIFF-файлами
    Функции для работы с RIFF-файлами Ваше приложение может работать с RIFF-файлами с использованием обычных функций ввода/вывода или с помощью функций, описанных выше (что удобнее). Дополнительно в б...
    Определение возможностей звуковых устройств мультимедиа
    Определение возможностей звуковых устройств мультимедиа Теперь, когда вы познакомились со структурой wav-файлов, нашей следующей задачей будет освоение приемов работы со звуковыми устройствами на...
    Приложение DRVLIST
    Приложение DRVLIST Приложение DRVLIST (листинг 2.13) поможет вам исследовать конфигурацию драйверов устройств мультимедиа, установленных в системе. Это приложение формирует в текущем каталоге текс...
    Воспроизведение звуковых данных
    Воспроизведение звуковых данных Для воспроизведения звуковых данных на низком уровне после определения возможностей устройства вывода необходимо открыть устройство. Это можно сделать с помощью фун...
    Запись звуковых данных
    Запись звуковых данных Процесс записи похож на процесс воспроизведения. Вначале необходимо открыть устройство записи, вызвав функцию waveInOpen : Функция waveInOpen UINT waveInOpen( LPHWAVEIN lphW...
    Другие функции низкого уровня
    Другие функции низкого уровня Перед тем как перейти к описанию приложения WAVE, перечислим еще несколько полезных функций, предназначенных для работы со звуком на низком уровне....
    Текстовое описание ошибки
    Текстовое описание ошибки Когда мы рассказывали об использовании функции mciSendString , то упоминали функцию mciGetErrorString, с помощью которой можно преобразовать код ошибки в текстовое описан...
    Определение номера устройства по идентификатору
    Определение номера устройства по идентификатору Если вы открыли устройство ввода или вывода с указанием константы WAVE_MAPPER, функция waveInOpen (или waveOutOpen, если открывается устройство выво...
    Сброс устройства
    Сброс устройства Функции waveInReset и waveOutReset выполняют, соответственно, останов устройства ввода или вывода и сброс текущей позиции для устройства в 0. Функция waveInReset UINT waveInReset(...
    Запуск устройства
    Запуск устройства Для запуска устройства ввода используется рассмотренная нами ранее функция waveInStart . Если же нужно продолжить работу приостановленного устройства вывода, следует вызвать функ...
    Останов устройства
    Останов устройства Для останова устройства ввода используется функция waveInStop, которая была рассмотрена нами в разделе, посвященному записи звука на низком уровне. Для временного останова работ...
    Определение текущей позиции
    Определение текущей позиции Приложение может определить текущую позицию в блоке при записи или воспроизведении, вызвав функцию waveInGetPosition или waveOutGetPosition, соответственно. Приведем оп...
    Управление громкостью
    Управление громкостью Ваше приложение может управлять громкостью сигнала при его воспроизведении. Для установки громкости следует использовать функцию waveOutSetVolume : Функция waveOutSetVolume U...
    Приложение WAVE
    Приложение WAVE В качестве примера использования интерфейса нижнего уровня для записи и воспроизведения wav-файлов мы представим вам исходные тексты приложения WAVE (рис.2.5)....
    Рис. 2.5. Главное окно приложения WAVE
    Рис. 2.5. Главное окно приложения WAVE Это приложение по своему внешнему виду и функциям аналогично приложению MCIWAVER, которое было создано с использованием интерфейса MCI. Приложение WAVE заказ...









Начало