Объект MM
Мультимедиа (Объект MM) | |||||
---|---|---|---|---|---|
|
Объект мультимедиа на данный момент поддерживает только работу с декодированием и выводом звука. В будущем планируется добавление других функций (к примеру, работу с микрофоном). Двумя основными внутренними объектами мультимедиа являются объект микшера (Mixer) и объект звука (Sound). Микшер, используя объекты звука, выводит данные с помощью определенного API на устройства вывода (наушники, колонки и пр.). Микшер используется, как устройство, которое может сложить множество звуков в один с помощью определенного алгоритма. Одновременно может существовать несколько объектов микшера, однако, определенные API (к примеру, WinMM) могут работать с проблемами, если этих объектов будет слишком много. Каждый из объектов микшера в отдельно взятое время может складывать произвольное количество звуков.
Объекты микшера и звука обладают важными характеристиками: частота дискретизации звука (samples per second), размер образца звука в битах (bits per sample) и количество каналов звука (channels). Для объекта микшера эти характеристики задаются при его создании и не могут быть изменены. Не все возможные комбинации характеристик могут быть приняты операционной системой, в зависимости от API вывода, функция создания микшера может завершиться ошибкой для некоторых комбинаций. Рекомендуется использовать более или менее стандартные значения. Обычными значениями samples per second являются 48000 или 44100 и их вариации (32000, 24000, 22050, 16000, 12000, 11025, 8000) образцов в секунду. Обычными значениями bits per sample являются 16 или 32 бит (при создании микшера другие значения пока не поддерживаются). Количество каналов зависит от аппаратной звуковой системы конкретного компьютера. Любой компьютер может использовать одноканальный (моно) или двухканальный (стерео) вывод звука. Некоторые системы могут также выводить звуки в режимах 3+1 (4 канала), 5+1 (6 каналов) и 7+1 (8 каналов). Для более высокой частоты дискретизации звука (samples per second), может потребоваться больше ресурсов процессора.
Каждый звук также обладает такими же характеристиками, как и объект микшера, однако, эти характеристики зависят от содержимого файла звука, а не выбираются при его загрузке в систему. Если характеристики звука отличаются от характеристик микшера, система автоматически произведет конвертирование звука (resampling) при его использовании в микшере. Обычно это недорогой с точки зрения ресурсов процесс, но если звуков очень много, он может использовать какое-то количество оперативной памяти и времени центрального процессора. К примеру, конвертирование между частотами 44100 и 48000 достаточно дорогое, так как эти частоты имеют малое количество общих множителей, однако, конвертирование из 44100 в 22050 очень быстрое и дешевое. Обычно рекомендуется использовать звуки, наиболее совместимые с создаваемым микшером, это уменьшит количество требуемых ресурсов, если звуков будет много.
Особой характеристикой при создании микшера является латентность (задержка вывода) звука. Эта величина зависит от внутреннего буфера микшера, API (интерфейса вывода) и драйвера вывода. Пользователь услышит звук, выводимый программой, не мгновенно, а только через какой-то небольшой промежуток времени. При слишком низкой латентности, внутренний буфер опустошается быстрее, чем система успевает его наполнять (наполнение обычно происходит кусками), поэтому звук слышен как совокупность прерывающихся частей. Латентности в 30-50 мс. должно быть достаточно практически для любых целей при выводе звука.
При панорамировании (смещении звука между каналами по определенным правилам) звука в системах с большим количеством колонок, можно создать эффект объемности, когда положение героя относительно источника звука перемещает его от одной колонки к другой или делает его тише или громче. Для работы с многоканальным звуком, перед созданием микшера желательно задать конфигурацию колонок с помощью функции SndChannels, после чего для каждого из проигрываемых звуков в отдельности можно использовать функции Pan или Pan2D.
При проигрывании иногда необходимо знать текущую позицию звука, играющуюся в данный момент, к примеру, чтобы обновить индикатор проигрывания. Для таких случаев, можно использовать функции Status или Position (последняя также может изменить текущую позицию). Функции позиции проигрывания оперируют количеством образцов или сэмплов (samples), а не временем, чтобы иметь максимальную точность. Номер проигрываемого образца можно превратить во время проигрывания с помощью функции SampleToSecond, и обратно с помощью функции SecondToSample. Получить размер звука в образцах можно с помощью функции GetTotalSamples. Важно также заметить, что номер образца (сэмпла) будет зависеть от характеристик микшера. При перекодировании звука под определенный микшер, его частота дискретизации может быть изменена, таким образом изменится количество дискретных образцов в нем, поэтому, использовать эти функции для звука, проигрывающегося в данный момент, нужно с указанием микшера. К примеру, звук с частотой дискретизации 11025 и длительностью ровно в 60 секунд содержит 661500 образцов (сэмплов), если проигрывать этот звук на микшере с частотой дискретизации в 44100, количество образов в проигрываемом звуке будет автоматически увеличено в 4 раза (до 2646000).
При создании микшера и загрузке звука есть также возможность выбрать API (интерфейс или стандарт) из поддерживаемых системой, и хотя обычно в этом нет необходимости, разные интерфейсы обладают разными возможностями. Система позволяет создавать микшеры со следующими характеристиками:
- Частота дискретизации образцов звука (samples per second): произвольная, но операционная система не поддерживает все частоты, рекомендуется использовать: 44100, 48000, 32000, 24000, 22050, 16000, 12000, 11025, 8000.
- Размер образца звука (bits per sample): 16 или 32.
- Количество каналов звука (channels): произвольное, но аппаратное обеспечение может поддерживать только определенное количество. Чтобы выяснить количество акустических колонок (каналов звука) в системе, можно использовать функцию DeviceList.
- При выводе звука используются следующие API:
- WinMM/MME (Windows Multimedia API / Microsoft Multimedia Environment). Старый стандарт, доступный в любой версии Windows. Начиная с Windows Vista, для его реализации используется эмуляция на основании других API, что добавляет латентности. Ограничения и возможности API:
- Латентность не ниже 30 мс (рекомендуется 50 мс)
- Создание микшеров с "экзотическими" частотами дискретизации и другими характеристиками будет вызывать ошибку (поддерживается только то, что поддерживает драйвер звука операционной системы).
- При изменении уровня (громкости) системного звука (см. SndSetVolume) может только изменить громкость приложения (не общесистемную громкость). При изменении громкости используются только два канала. Общую громкость отдельных каналов многоканального звука изменить нельзя (система позволяет изменять громкость отдельных звуков и микшеров, вне зависимости от API вывода).
- Имеет дополнительные возможности, к примеру Pitch или PlaybackRate.
- WASAPI / Core Audio (Windows Audio Session API / Core Audio API). Стандарт доступен, начиная с Windows Vista. Работает в двух режимах: в режиме общей сессии и в эксклюзивном режиме. Эксклюзивный режим не позволяет другим программам операционной системы иметь доступ к устройству вывода. В этом режиме можно создать единственный микшер и драйвер будет пытаться подстроиться под характеристики создаваемого микшера, и при попытке использования "экзотических" характеристик будет возвращать ошибку. Однако, в этом режиме можно добиться минимальной латентности. Ограничения и возможности API:
- В режиме общей сессии латентность до 30 мс. (она и рекомендуется). В эксклюзивном режиме латентность до 5-15 мс.
- В режиме общей сессии поддерживаются практически любые частоты дискретизации и количество каналов. Перекодировка будет автоматически производиться WASAPI или системой.
- В режиме общей сессии при изменении уровня (громкости) системного звука (см. SndSetVolume), может изменить общесистемную громкость, громкость приложения (без разреза каналов) и громкость сессии в разрезе каналов.
- Не поддерживает функции, типа Pitch или PlaybackRate.
- XAudio2 (Windows 7+). Планируется к добавлению в будущем.
- WinMM/MME (Windows Multimedia API / Microsoft Multimedia Environment). Старый стандарт, доступный в любой версии Windows. Начиная с Windows Vista, для его реализации используется эмуляция на основании других API, что добавляет латентности. Ограничения и возможности API:
Система позволяет загружать звуки следующих форматов (и характеристик):
- WAV без компрессии (PCM): произвольная частота дискретизации (samples per second), произвольное количество каналов, размер образца: 8, 16, 24, 32 бита. Система выполняет автоматически перекодировку (resampling) между звуками без компрессии с разными характеристиками, также можно использовать функцию ConvertTo.
- WAV с компрессией: декодируются форматы GSM6.10, u-law, A-law, MS ADPCM. Декодирование выполняется с помощью API ACM (Audio Compression Manager).
- MP3. Декодирование выполняется с помощью API ACM (Audio Compression Manager) или WMF (Windows Media Format, Windows XP+). Рекомендуется использовать декодер WMF, однако, он может добавить некоторое количество тишины в конце звука.
- WMA. Декодирование выполняется с помощью API WMF (Windows Media Format, Windows XP+). Рекомендуется использовать MP3 вместо этого формата.
- AC3, AAC, OGG -- Планируется к добавлению в будущем.
Простые примеры создания микшера и загрузки и проигрывания звука
Внешний демонстрационный объект sound.sfo является примитивным проигрывателем звуковых файлов, поддерживаемых системой. Его можно открыть в Студии и изучить код. Кроме того, ниже предлагается простой пример создания микшера, загрузки и проигрывания звука:
//Создадим микшер с частотой дискретизации 44100, 16-битным, стерео звуком для устройства вывода по умолчанию. aMixer:=MM.SndCreateMixer(,"44100,16,2",2); //Загрузим в память звук с диска. Try aSound:=MM.SndLoadSound("c:\sounds\sound.mp3"); Except Box("Невозможно загрузить файл: "+PopError(),Q_STOP); Exit; EndTry; //Начать проигрывание звука на микшере aMixer. aSound.Play(aMixer); //Ждать, пока звук не будет полностью проигран (Status()=0). Repeat Sleep(100); Until aSound.Status()=0;
Основные атрибуты и функции
Атрибуты и функции объекта мультимедиа и микшера
Идентификатор | Статус | Тип | Визуальная | Параметры | Описание |
---|---|---|---|---|---|
API | Реализована | Функция | MM.API():<> | ||
DeviceList | Реализована | Функция | MM.DeviceList():<> | ||
SndSetVolume | Реализована | Функция | MM.SndSetVolume():<> | ||
SndChannels | Реализована | Функция | MM.SndChannels():<> | ||
SndCreateMixer | Реализована | Функция | MM.SndCreateMixer():<> | ||
SndLoadSound | Реализована | Функция | MM.SndLoadSound():<> | ||
MixMethod | Реализована | Атрибут | MMixer.MixMethod():<> | ||
Latency | Реализована | Атрибут | MMixer.Latency():<> | ||
BufferHealth | Реализована | Атрибут | MMixer.BufferHealth():<> | ||
Stop | Реализована | Функция | MMixer.Stop():<> | ||
SetVolume | Реализована | Функция | MMixer.SetVolume():<> | ||
GetVolume | Реализована | Функция | MMixer.GetVolume():<> | ||
Pitch | Реализована | Функция | MMixer.Pitch():<> | ||
PlaybackRate | Реализована | Функция | MMixer.PlaybackRate():<> | ||
GetFormat | Реализована | Функция | MMixer.GetFormat():<> | ||
AddDSP | Реализована | Функция | MMixer.AddDSP():<> | ||
RemoveDSP | Реализована | Функция | MMixer.RemoveDSP():<> |
Атрибуты и функции объекта звука
Идентификатор | Статус | Тип | Визуальная | Параметры | Описание |
---|---|---|---|---|---|
Play | Реализована | Функция | MMSound.Play():<> | ||
SetVolume | Реализована | Функция | MMSound.SetVolume():<> | ||
GetVolume | Реализована | Функция | MMSound.GetVolume():<> | ||
Pan | Реализована | Функция | MMSound.Pan():<> | ||
Pan2D | Реализована | Функция | MMSound.Pan2D():<> | ||
Pan3D | Реализована | Функция | MMSound.Pan3D():<> | ||
GetFormat | Реализована | Функция | MMSound.GetFormat():<> | ||
GetTotalSamples | Реализована | Функция | MMSound.GetTotalSamples():<> | ||
Status | Реализована | Функция | MMSound.Status():<> | ||
Position | Реализована | Функция | MMSound.Position():<> | ||
SampleToSecond | Реализована | Функция | MMSound.SampleToSecond():<> | ||
SecondToSample | Реализована | Функция | MMSound.SecondToSample():<> | ||
Stop | Реализована | Функция | MMSound.Stop():<> | ||
Copy | Реализована | Функция | MMSound.Copy():<> | ||
Resample | Реализована | Функция | MMSound.Resample():<> | ||
ConvertTo | Реализована | Функция | MMSound.ConvertTo():<> | ||
Save | Реализована | Функция | MMSound.Save():<> |
|