Объект MM

From SunFlurry wiki
Revision as of 13:15, 5 January 2026 by 1>Admin (Атрибуты и функции объекта звука)
Jump to: navigation, search
  Мультимедиа (Объект MM)
Статус разработки: Реализован
Создание объекта: SndCreateMixer, SndLoadSound и пр.

Объект мультимедиа на данный момент поддерживает только работу с декодированием и выводом звука. В будущем планируется добавление других функций (к примеру, работу с микрофоном). Двумя основными внутренними объектами мультимедиа являются объект микшера (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+). Планируется к добавлению в будущем.

Система позволяет загружать звуки следующих форматов (и характеристик):

  • 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(<Тип стандарта (STRING)>,<Стандарт (STRING)>,<Параметры>):<Предыдущее значение стандарта (STRING)> Функция вызывается из интерфейса MM и задает использование API (стандартов) для определенных процессов.
DeviceList Реализована Функция MM.DeviceList(<Тип устройств (STRING,INT)>="SOUND"):<Список доступных устройств с их свойствами (LIST)> Функция вызывается из интерфейса MM и возвращает список доступных устройств со свойствами по их типу. К примеру, список устройств для вывода звука. Возвращаемые свойства и даже сами устройства могут зависеть от используемого стандарта при запросе. Стандарт можно задать перед вызовом функции с помощью функции API.
SndSetVolume Реализована Функция MM.SndSetVolume(<Код устройства или микшер (MIXER,STRING,INT)>,<Уровень канала 1 (REAL)>,<Уровень канала 2 (REAL)>...) Функция вызывается из интерфейса MM и задает уровень глобальной громкости, громкость, применительно к приложению или текущей сессии в разрезе колонок. Уровень задается в виде вещественных чисел от 0 (тишина) до 100 (макс. громкость). Работа функции сильно зависит от используемого стандарта (API). Для дополнительной информации, см. описание.
SndChannels, SndSpeakers Реализована Функция MM.SndChannels(,<Шаблон используемых колонок или код шаблона по умолчанию (STRING,INT)>):<Предыдущий шаблон (STRING)> Функция вызывается из интерфейса MM и задает шаблон использующихся колонок для вывода звука. Также можно задать один из кодов шаблонов по умолчанию. Для дополнительной информации, см. описание.
SndCreateMixer Реализована Функция MM.SndCreateMixer(<Код устройства (STRING,INT)>,<Параметры звука (STRING)>="44100,16",<Метод миксации (INT)>=2,<Желаемая латентность (INT)>,<Режим или маска конвертирования каналов (INT,STRING)>):<Объект созданного микшера (MIXER)> Функция вызывается из интерфейса MM и позволяет создать новый микшер. По умолчанию микшер использует предпочтительный из доступных стандарт (API), однако, стандарт может быть выбран с помощью функции API. Если код устройства не указан, микшер будет создан на устройстве по умолчанию. Желаемая латентность может быть уменьшена до минимально возможной, либо будет использовано умолчание, если аргумент не задан. Для получения результирующей латентности, используйте атрибут Latency. При проигрывании звуков с другим количеством каналов используется особая маска (или режим) конвертации каналов, задаваемая пятым аргументом.
MixMethod Реализована Атрибут MMixer.MixMethod:<Метод миксации (INT)> Атрибут возвращает метод миксации звуков для текущего микшера.
Latency Реализована Атрибут MMixer.Latency:<Текущая латентность (INT)> Атрибут возвращает текущую латентность для текущего микшера. Обычно это значение не изменяется в процессе работы микшера, и оно может отличаться от требуемого в момент создания микшера функцией SndCreateMixer.
BufferHealth Реализована Атрибут MMixer.BufferHealth:<Заполненность буфера вывода (REAL)> Атрибут возвращает заполненность буфера миксования на данный момент в процентах. Если это число близко к нулю, это означает, что латентность слишком низкая и буфер не успевает заполняться данными в достаточной степени, чтобы обеспечить бесперебойное проигрывание звука.
SndLoadSound Реализована Функция MM.SndLoadSound(<Источник (STRING,BUFFER)>,<Тип источника (INT)>=0,<Параметры для конвертирования (STRING,MIXER)>="" (без конвертирования),<Режим или маска конвертирования каналов (INT,STRING)>,<Формат конвертирования (STRING)>):<Объект загруженного звука (SOUND)> Функция загружает звук с диска из буфера или из строки с бинарными данными. Звук может быть сконвертирован при загрузке (поддержвается указание микшера для автоматического подбора параметров конвертирования). После загрузки, звук может быть проигран на микшере (Play), либо сохранен (Save). Один объект звука может проигрываться только на одном микшере в отдельно взятый момент, однако, если необходимо проигрывать множество копий одного звука, объект звука можно дублировать с помощью функции Copy, при этом сами загруженные в память бинарные данные не будут продублированы. Принимаются звуки разных форматов. Для дополнительной информации, смотрите описание функции.
Stop Планируется Функция MMixer.Stop(<Время затухания звуков в мс. (fade-out) (INT)>=0) Функция останавливает проигрывание всех звуков текущего микшера. Возможно использование затухания для более гладкой ощущаемой остановки. Запуск для проигрывания новых звуков на микшере по-прежнему разрешен, останаливается проигрывание только звуков, которые играются в данный момент.
SetVolume Реализована Функция MMixer.SetVolume(<Уровень канала 1 (REAL)>,<Уровень канала 2 (REAL)>...) Функция изменяет уровень звука для текущего микшера. Уровень задается в виде вещественных чисел от 0 (тишина) до 400 (в 4 раза громче оригинальной громкости). При значении 100, уровень проигрываемых звуков не будет изменяться (индивидуальные уровни громкости доступны для каждого объекта звука). При значении больше 100, уровень всех звуков будет пропорционально увеличен, при этом могут произойти искажения, если звук был достаточно громким из без этого увеличения. Используется линейный уровень (не логарифмический, как он обычно воспринимается человеческим ухом). При указании всего одного аргумента, уровень будет установлен для всех каналов. Если в микшере больше каналов, чем задано аргументов для функции, для остальных каналов будет использован уровень, заданный последним аргументом. Если аргументов не задано, уровень не изменяется.
GetVolume Планируется Функция MMixer.GetVolume():<Список уровней звуков (LIST)> Функция возвращает список уровней звуков для текущего микшера.
Pitch Планируется Функция MMixer.Pitch(<Высота звука (REAL)>):<Текущая высота звука (REAL)> Функция изменяет высоту звуков для всего микшера. Может использоваться только для определенных API (WinMM). Рекомендуется использовать функции DPS вместо данной.
PlaybackRate Планируется Функция MMixer.PlaybackRate(<Скорость проигрывания (REAL)>):<Текущая скорость проигрывания (REAL)> Функция изменяет скорость проигрывания звуков для всего микшера. Может использоваться только для определенных API (WinMM). Рекомендуется использовать функции DPS вместо данной.
GetFormat Планируется Функция MMixer.GetFormat(<Частота дискретизации микшера (INT)>,<Размер образца звука микшера (INT)>,<Количество каналов микшера (INT)>):<Формат строкой (STRING)> Функция получает звуковые характеристики для текущего микшера.
AddDSP Планируется Функция MMixer.AddDSP() Функция добавляет процессор цифровой обработки звука для данного микшера.
RemoveDSP Планируется Функция MMixer.RemoveDSP() Функция удаляет процессор цифровой обработки звука для данного микшера.

Атрибуты и функции объекта звука

Идентификатор Статус Тип Визуальная Параметры Описание
Play Реализована Функция MMSound.Play(<Микшер для проигрывания (MIXER)>,<Начинать с образца (INT)>=0,<Количество повторений (INT)>=1,<Время увеличения громкости до рабочей, мс. (fade-in) (INT)>=0,<Режим или маска конвертирования каналов (INT,STRING)>) Функция инициирует проигрывание звука на заданном микшере, если звук уже находился в состоянии проигрывания, оно будет сначала остановлено. Звук может начинать проигрывание с заданного образца (сэмпла) с учетом частоты дискретизации текущего микшера (т.е., после конвертирования звука, если таковое происходит). Проигрывание звука может повторяться указанное количество раз (при указании значения -1, звук будет повторяться неограниченное количество раз). Также возможно задать время увеличения громкости звука до рабочей (fade-in), т.е. начальная громкость звука будет увеливаться плавно до рабочей после чего проигрываться с рабочей громкостью до конца. Может быть задана особая маска (или режим) конвертации каналов, если количество каналов в звуке отличается от такового в микшере, если аргумент конвертирования каналов не задан, будет использован способ конвертирования, указанный при создании микшера. Один объект звука может проигрываться только на одном микшере в отдельно взятый момент, однако, если необходимо проигрывать множество копий одного звука, объект звука можно дублировать с помощью функции Copy, при этом сами загруженные в память бинарные данные не будут продублированы.
SetVolume Реализована Функция MMSound.SetVolume(<Уровень канала 1 (REAL)>,<Уровень канала 2 (REAL)>...) Функция изменяет уровень звука для текущего звука. Функцию можно вызывать как для звука, который проигрывается в данный момент, так и для звука, который не проигрывается. Уровень задается в виде вещественных чисел от 0 (тишина) до 400 (в 4 раза громче оригинальной громкости). При значении 100, уровень проигрываемого звука не будет изменяться. При значении больше 100, уровень звука будет пропорционально увеличен, при этом могут произойти искажения, если звук был достаточно громким из без этого увеличения. Используется линейный уровень (не логарифмический, как он обычно воспринимается человеческим ухом). При указании всего одного аргумента, уровень будет установлен для всех каналов. Если в микшере больше каналов, чем задано аргументов для функции, для остальных каналов будет использован уровень, заданный последним аргументом. Если аргументов не задано, уровень не изменяется.
GetVolume Планируется Функция MMSound.GetVolume():<Список уровней громкости (LIST)> Функция возвращает список уровней громкости для текущего звука.
Pan Реализована Функция MMSound.Pan(<Формула панорамирования (STRING,BUFFER)>,<Для микшера (MIXER)>) Функция задает формулу панорамирования для звука (изменения громкости звука по разным каналам в зависимости от канала). Звук может проигрываться в данный момент. Если звук не проигрывается, необходимо указать также микшер (вторым аргументом), из установок которого будет использована конфигурация каналов. Данная функция универсальна, настроить ее для 2D или 3D положения звука сложно, для упрощения можно использовать функции Pan2D и Pan3D, которые автоматически подбирают формулу панорамирования.
Pan2D Реализована Функция MMSound.Pan2D(<Позиция X источника звука (REAL)>,<Позиция Y источника звука (REAL)>,<Интенсивность звука в точке 0,0 (REAL)>=1.0,<Для микшера (MIXER)>):<> Функция вычисляет формулу панорамирования, когда источник звука находится в точке X,Y в плоской системе координат (шкала Y направлена от наблюдателя на колонку FC (front center)), а слушатель находится в точке 0,0. Для многоколоночной конфигурации, разные колонки будут выводить звук с разной громкостью. Если источник звука будет находиться в точке 0,0, оригинальные громкости всех колонок будут умножены на коэффициент третьего аргумента, но их положение в колонках изменено не будет. Звук может проигрываться в данный момент. Если звук не проигрывается, необходимо указать также микшер (четвертым аргументом), из установок которого будет использована конфигурация каналов. Для прямого указания формулы панорамирования, используется более универсальная функция Pan.
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():<>