Page 1 of 1

Подскажите, пожалуйста, как работать с функциями

Posted: Sun Jan 14, 2018 9:47 pm
by iHs
Уважаемый NightRadio! Поясните, как работают следующие функции (в доках очень мало информации):
  • set_audio_callback - какие параметры передаются в функцию audio_callback, что такое $stream, $frames, $time? Как узнать размер буфера, в который программа должна выводить сигнал (в мс, в отсчётах)? Как выполняется эта функция, в прерывании или в отдельном потоке? (этот вопрос важен, если она использует общий с основной программой глобальный массив.)
  • fft( inverse, im, re, size ) - преобразование Фурье - можно догадаться, откуда берутся данные, но куда пишется результат?
  • wavetable_generator - если я правильно понимаю, эта функция создаёт массив генераторов, проигрывающих одну и ту же звуковую волну (сэмпл), но с разной скоростью? Она работает постоянно в фоне или её нужно каждый раз вызывать, чтьбы заполнить аудио буфер?

Re: Подскажите, пожалуйста, как работать с функциями

Posted: Mon Jan 15, 2018 11:50 pm
by NightRadio
Добрый день!
set_audio_callback - какие параметры передаются в функцию audio_callback, что такое $stream, $frames, $time? Как узнать размер буфера, в который программа должна выводить сигнал (в мс, в отсчётах)? Как выполняется эта функция, в прерывании или в отдельном потоке? (этот вопрос важен, если она использует общий с основной программой глобальный массив.)
Параметры для audio_callback:
  • $stream - ID звукового потока; в текущей версии пока не используется;
  • $userdata - параметр, который вы указали в set_audio_callback();
  • $channels - массив контейнеров с каналами: буфер левого канала $channels[ 0 ], буфер правого канала $channels[ 1 ];
  • $frames - количество отсчетов, которое нужно заполнить в каждом канале; это число может быть любым, но чаще всего оно находится в диапазоне от 1 до размера аудио-буфера, указанного в глобальных настройках Pixilang;
  • $time - время, когда начнет играть запрашиваемый кусок звука; единица времени - системный тик (аналогично функциям get_ticks() и get_tps()).
audio_callback выполняется в отдельном потоке и имеет доступ ко всем глобальным переменным основной программы.
fft( inverse, im, re, size ) - преобразование Фурье - можно догадаться, откуда берутся данные, но куда пишется результат?
Результат пишется в исходные контейнеры. То есть, исходные данные заменяются выходными.
Рекомендую ознакомиться с примерами fft и fft2 в папке graphics.
wavetable_generator - если я правильно понимаю, эта функция создаёт массив генераторов, проигрывающих одну и ту же звуковую волну (сэмпл), но с разной скоростью? Она работает постоянно в фоне или её нужно каждый раз вызывать, чтьбы заполнить аудио буфер?
Ее нужно каждый раз вызывать в audio_callback или где-то еще (в случае с offline-рендером звука).

Если возникнут еще вопросы - пишите

Re: Подскажите, пожалуйста, как работать с функциями

Posted: Tue Jan 16, 2018 8:25 pm
by iHs
Спасибо за ответ! Кстати, в примерах встречается и такое объявление -

Code: Select all

fn audio_callback(
    $stream, 
    $userdata, 
    $channels, 
    $frames, 
    $output_time_in_system_ticks, 
    $in_channels, 
    $latency_in_frames )
Система Windows7, встроенное аудио Realtek HD, длина буфера 2048 отсчётов, нельзя ли в самой программе явно задать размер буфера (с возвратом "успешно" или "нет", поддерживается ли такое значение), если нужна задержка поменьше?
Скажите, в каком формате выполняются вычисления, какой тип у числовых переменных по умолчанию - int32? Если в выражении есть дробное число, например 2.0 или M_PI, то результат будет float32? Если я скопирую данные из контейнера int16 в float32 функцией copy, то будет ли приведение типов?

Re: Подскажите, пожалуйста, как работать с функциями

Posted: Wed Jan 17, 2018 9:39 am
by NightRadio
Кстати, в примерах встречается и такое объявление...
Да, там добавлены два параметра - в мануал не успел их вписать :)
$in_channels - аналогично $channels, только в обратную сторону. То есть, эти каналы не надо заполнять - они уже заполнены данными с микрофона или линейного входа.
$latency_in_frames - задержка между рендером звука и его физическим выходом на динамики. Измеряется в отсчетах. Чаще всего, это число равно размеру буфера, заданного в настройках Pixilang. Но может быть и больше, если аудио драйвер будет более точно считать, учитывая дополнительные задержки на низком уровне.
Система Windows7, встроенное аудио Realtek HD, длина буфера 2048 отсчётов, нельзя ли в самой программе явно задать размер буфера (с возвратом "успешно" или "нет", поддерживается ли такое значение), если нужна задержка поменьше?
Пока нет. Есть два пути сменить длину буфера:
1) в системных настройках Pixilang: в стартовом диалоге кнопка "Настр." или через вызов функции prefs_dialog();
2) в файле pixilang_config.ini (параметр buffer xxxx), который должен лежать в одной папке с pixilang.
Скажите, в каком формате выполняются вычисления, какой тип у числовых переменных по умолчанию - int32? Если в выражении есть дробное число, например 2.0 или M_PI, то результат будет float32? Если я скопирую данные из контейнера int16 в float32 функцией copy, то будет ли приведение типов?
На все вопросы - да :)