exponenta event banner

audioDeviceWriter

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

Описание

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

Поток данных устройства записи аудиоустройств

  • Вызовите объект для ввода кадра аудиосигнала в audioDeviceWriter.

  • audioDeviceWriter использует указанный драйвер для передачи кадра (ввода устройства) в буфер указанного аудиоустройства.

  • Звуковое устройство выполняет цифроаналоговое преобразование с заданной частотой дискретизации и битовой глубиной.

  • Аудиоустройство выводит аналоговый блок на громкоговоритель.

Для потоковой передачи данных на аудиоустройство:

  1. Создать audioDeviceWriter и задайте его свойства.

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

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

Создание

Описание

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

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

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

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

Свойства

развернуть все

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

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

Дополнительные сведения об изменении значений свойств см. в разделе Проектирование системы в MATLAB с использованием системных объектов.

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

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

    Примечание

    Если Driver указывается как 'ASIO', использовать asiosettings (Audio Toolbox) для установки размера буфера звуковой карты на размер буфера audioDeviceWriter Системный объект.

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

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

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

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

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

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

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

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

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

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

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

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

Параметр, поддерживающий переменный размер кадра, указанный как true или false.

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

  • true - Если audioDeviceWriter объект заблокирован, размер входного кадра может изменяться при каждом вызове. Размер буфера аудиоустройства задается с помощью свойства BufferSize.

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

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

Примечание

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

Зависимости

Чтобы включить это свойство, задайте для параметра SupportVariiveStartInput значение true.

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

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

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

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

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

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

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

Примечание

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

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

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

Зависимости

Чтобы включить это свойство, задайте для StartMappingSource значение '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

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

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

release(obj)

развернуть все

getAudioDevicesСписок доступных аудиоустройств
infoИнформация о характеристиках устройства записи звука
cloneСоздать повторяющийся объект System
isLockedОпределить, используется ли объект System
releaseДеблокирование ресурсов и разрешение изменений значений свойств объекта системы и входных признаков
resetСброс внутренних состояний объекта System
stepЗапустить алгоритм объекта System
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™ сократить задержки из-за размера буфера устройства.

Создать 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

Недостаточная загрузка означает молчание выходного сигнала, которое происходит, когда контур аудиопотока не успевает за выходным устройством. Определите недостаточность цикла аудиопотока, добавьте искусственную вычислительную нагрузку в цикл аудиопотока, а затем измените свойства 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размер буфера аудиоустройства совпадает с размером входного кадра. Увеличение размера буфера устройства уменьшает недозапуск.

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.

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

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

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

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

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

.

См. также

| | | (Панель звуковых инструментов) | (Панель звуковых инструментов)

Представлен в R2016a