Windows PCM формат

Windows PCM (Pulse code modulation) формат применяется при вводе-выводе звука с помощью семейства функций WinAPI WaveOut/WaveIn. Это очень простой формат. Звук хранится в виде выборок электрического напряжения сделанных с некоторой частотой.

PCM 16 бит записывается в виде signed short:
-32767 - минимум
0      - ноль
+32767 - максимум

PCM 8 бит записывается в виде unsigned char:
0      - минимум
127    - ноль
256    - максимум

PCM Stereo записывается также в одном буфере по-очереди левый-правый:
ЛПЛП...

Немного философии. Об аналогии между реальным и виртуальным миром.

Несмотря на распространенное мнение, что мир компьтеров – это что-то отдаленное от реального мира, можно привести много аналогий между взаимооотношениями в реальном и витуальном мире.

Рассмотрим на примере вывода звука. Данное действие хорошо укладывается во взаимоотношения между работником, работодателем и потребителем. В данном примере в качестве работника выступает прикладная программа, в качестве работодателя операционная система и в качестве потребителя
пользователь компьютера.

Работник выполняет работу, в данном случае вырабатывает последовательность звуковых данных. Работодатель обладает средствами производства, в данном случае звуковой картой. Потребителю сбывают готовый товар, в данном случае звук.

    Итак:

  1. Работнику чтобы начать работать, нужно устроится на работу. Это он делает с помощью функции waveOutOpen, которая возвращает значение hWaveOut. Работнику может быть отказано в приеме на работу, тогда hWaveOut==NULL. Если работник принят, то hWaveOut можно рассматривать в качестве табельного номера. Также работнику выдают пропуск – возможность пользоваться функциями вывода звука.
  2. Работник начинает работать и готовую работу отдает работодателю с помощью функции waveOutWrite. Работодатель складирует полученную работу в очередь драйвера и ритмично отгружает потребителю – звучит звук.
  3. Если работник хочет прекратить работу, то он должен заранее известить об этом работодателя функцией waveOutBreakLoop (извещает работодателя, что доделал последнюю работу) или waveOutReset (извещает работодателя что хочет прекрать работать немедленно). Если работник просто прекратит работать, то работодателю придется отгружать потребителю недоделанную работу (слышен пердящий звук).
  4. Чтобы расстаться с работодателем, работник должен уволиться с помощью функции waveOutClose. В таком случае у него отбирают табельный номер и пропуск.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *