audioDeviceWriter

Воспроизведение на звуковую карту

Описание

The audioDeviceWriter Система object™ записывает аудио выборок в устройство аудио выхода. Свойства аудио устройства средства записи задать драйвер, устройство и атрибуты устройства, такие как частота дискретизации, глубина бита и buffer size.

Смотрите Аудио ввода-вывода: Буферизация, Задержка и Пропускная способность для подробного объяснения аудио устройства средства записи потока данных.

Чтобы передать данные в аудио устройство:

  1. Создайте audioDeviceWriter Объекту и установите его свойства.

  2. Вызывайте объект с аргументами, как будто это функция.

Дополнительные сведения о работе системных объектов см. в разделе «Что такое системные объекты?».

Создание

Описание

deviceWriter = audioDeviceWriter возвращает Системный объект, deviceWriter, который записывает аудио выборки в устройство выхода аудио в режиме реального времени.

deviceWriter = audioDeviceWriter(sampleRateValue) устанавливает свойство SampleRate на sampleRateValue.

deviceWriter = audioDeviceWriter(___,Name,Value) устанавливает каждое свойство Name к заданной Value. Неопределенные свойства имеют значения по умолчанию.

Пример: deviceWriter = audioDeviceWriter(48000,'BitDepth','8-bit integer') создает Системный объект, deviceWriter, который действует со скоростью дискретизации 48 кГц и 8-битовой целочисленной битовой глубиной.

Свойства

расширить все

Если не указано иное, свойства являются нетронутыми, что означает, что вы не можете изменить их значения после вызова объекта. Объекты блокируются, когда вы вызываете их, и release функция разблокирует их.

Если свойство настраивается, можно изменить его значение в любой момент.

Для получения дополнительной информации об изменении значений свойств смотрите Разработку системы в MATLAB Использование Системных объектов.

Драйвер, используемый для доступа к вашему аудио устройству, задается как 'DirectSound', 'ASIO', или 'WASAPI'.

  • ASIO™ драйверы не устанавливаются в Windows® машин. Как использовать 'ASIO' опция драйвера, установите драйвер ASIO вне MATLAB®.

    Примечание

    Если Driver задается как 'ASIO', использование asiosettings чтобы установить buffer size звуковой карты равным buffer size вашего audioDeviceWriter Системный объект.

  • Драйверы WASAPI поддерживаются только в эксклюзивном режиме.

Драйверы ASIO и WASAPI не обеспечивают преобразование частоты дискретизации. Для драйверов ASIO и WASAPI установите SampleRate к частоте дискретизации, поддерживаемой вашим аудио устройством.

Это свойство применяется только к компьютерам с Windows. Linux® машины всегда используют драйвер ALSA. Mac-машины всегда используют драйвер CoreAudio.

Как задать nondefault Driver значения должны иметь лицензию Audio Toolbox™. Если тулбокс не установлен, задайте nondefault Driver возвращает ошибку.

Типы данных: char | string

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

Типы данных: char | string

Частота дискретизации сигнала, отправленного в аудио устройство, в Гц, заданная как положительное целое число. Область области значений SampleRate зависит от вашего аудио оборудование.

Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

Тип данных, используемый устройством, задается как вектор символов или строковый скаляр. Перед выполнением цифроаналогового преобразования входные данные приводятся к типу данных, заданному BitDepth.

Как задать ненужное BitDepthнеобходимо иметь лицензию Audio Toolbox. Если тулбокс не установлен, задается значение nondefault BitDepth возвращает ошибку.

Типы данных: char | string

Опция для поддержки переменного формата кадра, заданная как true или false.

  • false - Если audioDeviceWriter объект заблокирован, вход должен иметь одинаковый формат кадра при каждом вызове. Buffer size вашего аудио устройства совпадает с размером входного кадра.

  • true - Если audioDeviceWriter объект заблокирован, размер входного кадра может измениться при каждом вызове. Значение buffer size вашего аудио устройства задается свойством BufferSize.

Типы данных: char

Buffer size аудио устройства, заданная как положительное целое число.

Примечание

Если Driver задается как 'ASIO'откройте пользовательский интерфейс ASIO, чтобы установить buffer size звуковой карты равным BufferSize значение вашего audioDeviceWriter Системный объект.

Зависимости

Чтобы включить это свойство, установите значение SupportVariableSizeInput на true.

Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

Источник отображения между столбцами матрицы входа и каналами устройства аудио выхода, заданный как 'Auto' или 'Property'.

  • 'Auto' - Настройки по умолчанию определяют отображение между столбцами входа матрицы и каналами устройства аудио выхода. Для примера предположим, что ваш вход является матрицей с четырьмя столбцами, и ваше аудио устройство имеет четыре доступных канала. Столбец 1 ваших входных данных записывает в канал 1 вашего устройства, столбец 2 ваших входных данных записывает в канал 2 вашего устройства и так далее.

  • 'Property' - Свойство ChannelMapping определяет отображение между столбцами входа матрицы и каналами устройства аудио выхода.

Типы данных: char | string

Сопоставление Nondefault между столбцами входа матрицы и каналами выхода устройства, заданное как скаляр или вектор допустимых индексов канала. Дополнительные сведения см. в примере «Настройка отображения каналов для audioDeviceWriter».

Чтобы выборочно сопоставить между столбцами матрицы входа и каналами выхода звуковой карты, вы должны иметь лицензию Audio Toolbox. Если тулбокс не установлен, задается значение nondefault ChannelMapping возвращает ошибку.

Примечание

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

Пример: outputLeftOnly = [x(:,1) zeros(size(x,1),1)];

Пример: outputRightOnly = [zeros(size(x,1),1) x(:,1)];

Зависимости

Чтобы включить это свойство, установите значение ChannelMappingSource на 'Property'.

Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

Использование

Описание

пример

numUnderrun = deviceWriter(audioToDevice) записывает одну систему координат аудио выборок, audioToDevice, к выбранному аудио устройству и возвратам количество аудио выборок, недоиспользуемых с момента последнего вызова deviceWriter.

Примечание:  Когда вы вызываете audioDeviceWriter Системный объект, аудио устройство, заданная как Device свойство заблокировано. Аудио устройство может быть заблокировано только одним audioDeviceWriter за раз. Чтобы отпустить аудио устройство, позвоните release на вашем audioDeviceWriter Системный объект.

Входные параметры

расширить все

Аудиосигнал для записи в устройство, заданный как матрица. Столбцы матрицы рассматриваются как независимые аудиоканалы.

Если audioToDevice относится к типу данных 'double' или 'single', значение аудио устройства средства записи клипса за пределами области значений [-1, 1]. Для других типов данных допустимая входная область значений равна [min, max] заданного типа данных.

Типы данных: single | double | int16 | int32 | uint8

Выходные аргументы

расширить все

Количество выборок, по которым очередь аудио устройства средства записи была недооценена с момента последнего вызова deviceWriter.

Типы данных: uint32

Функции объекта

Чтобы использовать функцию объекта, задайте системный объект в качестве первого входного параметра. Например, чтобы освободить системные ресурсы системного объекта с именем obj, используйте следующий синтаксис:

release(obj)

расширить все

getAudioDevicesСписок доступных аудио устройств
infoПолучите аудио устройство информацию
cloneСоздайте повторяющийся системный объект
isLockedОпределите, используется ли системный объект
releaseОтпустите ресурсы и допустите изменения в значениях свойств системного объекта и входных характеристиках
resetСброс внутренних состояний Системного объекта
stepЗапуск алгоритма системного объекта
setupОдноразовая настройка задач для системных объектов

Примеры

свернуть все

Прочтите MP3 аудио файла и воспроизведите его через устройство аудио выхода по умолчанию.

Создайте dsp.AudioFileReader объект с настройками по умолчанию. Используйте audioinfo функция для возврата структуры, содержащей информацию о аудио файла.

fileReader = dsp.AudioFileReader('speech_dft.mp3');
fileInfo = audioinfo('speech_dft.mp3')
fileInfo = struct with fields:
             Filename: '/mathworks/devel/bat/BR2021ad/build/matlab/toolbox/dsp/dsp/speech_dft.mp3'
    CompressionMethod: 'MP3'
          NumChannels: 1
           SampleRate: 22050
         TotalSamples: 112320
             Duration: 5.0939
                Title: []
              Comment: []
               Artist: []
              BitRate: 64

Создайте audioDeviceWriter и задайте частоту дискретизации.

deviceWriter = audioDeviceWriter('SampleRate',fileInfo.SampleRate);

Функции setup чтобы уменьшить вычислительную нагрузку инициализации в цикле аудиопотока.

setup(deviceWriter,zeros(fileReader.SamplesPerFrame,fileInfo.NumChannels))

Используйте info функция для получения характеристической информации о средстве записи.

info(deviceWriter)
ans = struct with fields:
                   Driver: 'ALSA'
               DeviceName: 'ALSAdefault'
    MaximumOutputChannels: 32

В цикле аудиопотока считайте систему координат аудиосигнала из файла и запишите систему координат на ваше устройство.

while ~isDone(fileReader)
    audioData = fileReader();
    deviceWriter(audioData);
end

Закройте файл входа и отпустите устройство.

release(fileReader)
release(deviceWriter)

Задержка из-за буфера выходного устройства является временной задержкой записи одной системы координат данных. Измените свойства вашего audioDeviceWriter по умолчанию Система object™, чтобы уменьшить задержку из-за buffer size устройства.

Создайте dsp.AudioFileReader Системный объект для чтения аудио файла с настройками по умолчанию.

fileReader = dsp.AudioFileReader('speech_dft.mp3');

Создайте audioDeviceWriter Системный объект и укажите частоту дискретизации, которая совпадает с частотой дискретизации устройства чтения аудио файла.

deviceWriter = audioDeviceWriter(...
    'SampleRate',fileReader.SampleRate);

Вычислите задержку из-за буфера устройства в секундах.

bufferLatency = fileReader.SamplesPerFrame/deviceWriter.SampleRate %#ok
bufferLatency = 0.0464

Установите SamplesPerFrame свойство вашего dsp.AudioFileReader Системный объект 256. Вычислите задержку буфера в секундах.

fileReader.SamplesPerFrame = 256;
bufferLatency = fileReader.SamplesPerFrame/deviceWriter.SampleRate
bufferLatency = 0.0116

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

Создайте dsp.AudioFileReader Объектом и укажите файл для чтения. Используйте audioinfo функция для возврата структуры, содержащей информацию о аудио файла.

fileReader = dsp.AudioFileReader('speech_dft.mp3');
fileInfo = audioinfo('speech_dft.mp3');

Создайте audioDeviceWriter объект. Используйте SampleRate программы чтения файлов как SampleRate Средство записи устройства. Функции setup чтобы уменьшить вычислительную нагрузку инициализации в цикле аудиопотока.

deviceWriter = audioDeviceWriter('SampleRate',fileReader.SampleRate);
setup(deviceWriter,zeros(fileReader.SamplesPerFrame,fileInfo.NumChannels))

Запустите цикл аудиопотока с входом из файла и выводом на устройство. Печать общего количества выборок в недокруте и недокруте в секундах.

totalUnderrun = 0;
while ~isDone(fileReader)
    input = fileReader();
    numUnderrun = deviceWriter(input);
    totalUnderrun = totalUnderrun + numUnderrun;
end
fprintf('Total samples underrun: %d.\n',totalUnderrun)
Total samples underrun: 0.
fprintf('Total seconds underrun: %d.\n',double(totalUnderrun)/double(deviceWriter.SampleRate))
Total seconds underrun: 0.

Отпустите dsp.AudioFileReader и audioDeviceWriter Объектам и установите переменную счетчика на нуль.

release(fileReader)
release(deviceWriter)
totalUnderrun = 0;

Использование pause для имитации алгоритма, который занимает 0,075 секунды. Пауза заставляет цикл аудиопотока идти медленнее, чем устройство, что приводит к периодам молчания в выход аудиосигнале.

while ~isDone(fileReader)
    input = fileReader();
    numUnderrun = deviceWriter(input);
    totalUnderrun = totalUnderrun + numUnderrun;
    pause(0.075)
end
fprintf('Total samples underrun: %d.\n',totalUnderrun)
Total samples underrun: 71680.
fprintf('Total seconds underrun: %d.\n',double(totalUnderrun)/double(deviceWriter.SampleRate))
Total seconds underrun: 3.250794e+00.

Отпустите audioDeviceReader и dsp.AudioFileWriter и установите переменную счетчика равного нуля.

release(fileReader)
release(deviceWriter)
totalUnderrun = 0;

Установите формат кадра цикла аудиопотока равным 2048. Потому что SupportVariableSizeInput свойство вашего audioDeviceWriter Для системного объекта задано значение false, buffer size вашего аудио устройства совпадает с размером входного кадра. Увеличение buffer size устройства уменьшает пробел.

fileReader = dsp.AudioFileReader('speech_dft.mp3');
fileReader.SamplesPerFrame = 2048;
fileInfo = audioinfo('speech_dft.mp3');

deviceWriter = audioDeviceWriter('SampleRate',fileReader.SampleRate);
setup(deviceWriter,zeros(fileReader.SamplesPerFrame,fileInfo.NumChannels))

Вычислим общее количество недокрутов.

while ~isDone(fileReader)
    input = fileReader();
    numUnderrun = deviceWriter(input);
    totalUnderrun = totalUnderrun + numUnderrun;
    pause(0.075)
end
fprintf('Total samples underrun: %d.\n',totalUnderrun)
Total samples underrun: 0.
fprintf('Total seconds underrun: %d.\n',double(totalUnderrun)/double(deviceWriter.SampleRate))
Total seconds underrun: 0.

Увеличенный формат кадра уменьшает общее зондирование цикла аудиопотока. Однако увеличение формата кадра также увеличивает задержку. Другие подходы к сокращению недоукомплектованности включают:

  • Увеличение buffer size независимо от размера входного кадра. Чтобы увеличить buffer size независимо от размера входного кадра, необходимо сначала задать SupportVariableSizeInput на true. Этот подход также увеличивает задержки.

  • Уменьшение частоты дискретизации. Уменьшение частоты дискретизации уменьшает как задержку, так и недооценку за счет разрешения сигнала.

  • Выбор оптимальных драйвера и устройства для вашей системы.

Задайте nondefault отображения канала для audioDeviceWriter объект. Этот пример относится к конкретному оборудованию. Он принимает, что на вашем компьютере есть устройство аудио выхода по умолчанию с двумя доступными каналами.

Создайте audioDeviceWriter объект с настройками по умолчанию.

deviceWriter = audioDeviceWriter;

По умолчанию в audioDeviceWriter объект записывает максимальное количество доступных каналов, соответствующее столбцам матрицы входа. Использование info получить максимальное количество каналов вашего устройства.

info(deviceWriter)
ans = struct with fields:
                   Driver: 'DirectSound'
               DeviceName: 'Primary Sound Driver'
    MaximumOutputChannels: 2

Если deviceWriter вызывается с одним столбцом данных, два канала записываются на ваше устройство аудио выхода. Оба канала соответствуют одному столбцу данных.

Используйте audioOscillator объект для вывода тонального сигнала в audioDeviceWriter объект. Ваш объект, sineGenerator, возвращает вектор при вызове.

sineGenerator = audioOscillator;

Напишите синус-тон своему аудио устройству. Если вы используете наушники, слышишь тон от обоих каналов.

count = 0;
while count < 500
    sine = sineGenerator();
    deviceWriter(sine);
    count = count + 1;
end

Если ваш audioDeviceWriter вызывается объект с двумя столбцами данных, два канала записываются на ваше устройство аудио выхода. Первый столбец соответствует каналу 1 вашего устройства аудио выхода, а второй столбец соответствует каналу 2 вашего устройства аудио выхода.

Напишите двухколоночную матрицу на устройство выхода аудио. Столбец 1 соответствует синусоидальному тональному сигналу, а столбец 2 соответствует статическому сигналу. Если вы используете наушники, можно услышать тон от одного динамика и статический от другого динамика.

count = 0;
while count < 500
    sine = sineGenerator();
    static = randn(length(sine),1);
    deviceWriter([sine,static]);
    count = count + 1;
end

Задайте альтернативные отображения между каналами вашего устройства и столбцами выходной матрицы путем указания номера выходного канала в индексе, соответствующем входному столбцу. Задайте ChannelMappingSource на 'Property'. Укажите, что первый столбец ваших входных данных записывает в канал 2 вашего выхода и что второй столбец ваших входных данных записывает в канал 1 вашего устройства выхода. Чтобы изменить отображение каналов, необходимо сначала разблокировать audioDeviceReader объект.

release(deviceWriter)
deviceWriter.ChannelMappingSource = 'Property';
deviceWriter.ChannelMapping = [2,1];

Воспроизведение аудиосигналов с обратным отображением. Если вы используете наушники, заметьте, что тон и статика имеют переключатели.

count = 0;
while count < 500
    sine = sineGenerator();
    static = randn(length(sine),1);
    deviceWriter([sine,static]);
    count = count + 1;
end

Расширенные возможности

.
Введенный в R2016a
Для просмотра документации необходимо авторизоваться на сайте