воспроизведение только части звука с использованием FMOD - PullRequest
1 голос
/ 27 февраля 2010

Я пытаюсь воспроизвести только часть звука, используя FMOD, скажем, кадры 50000-100000 из файла 200000 кадров. Я нашел несколько способов поиска вперед (т. Е. Начать воспроизведение с кадра 50000), но я не нашел способа убедиться, что звук перестает воспроизводиться на 100000. Есть ли способ, как FMOD может сделать это без необходимости добавления lbsndfile или подобное на картинке?

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

Ответы [ 3 ]

4 голосов
/ 26 марта 2010

Вы можете использовать Channel :: setDelay для точного сэмплирования запуска и остановки звука. Используйте FMOD_DELAYTYPE_DSPCLOCK_START, чтобы установить время начала звука, и FMOD_DELAYTYPE_DSPCLOCK_END, чтобы установить время окончания.

Проверьте документы для Channel :: setDelay, FMOD_DELAYTYPE, System :: getDSPClock.

1 голос
/ 26 июля 2010

Чтобы начать воспроизведение с сэмпла 50 000 и закончить с 100 000, вы можете сделать следующее, предполагая, что частота дискретизации звукового файла и частота дискретизации системы совпадают.Поскольку тактовая частота DSP работает в системных выходных выборках, вам может потребоваться выполнить некоторые математические расчеты, чтобы скорректировать конечную выборку с точки зрения выходной частоты.См. Sound :: getDefaults для частоты дискретизации звука и System :: getSoftwareFormat для системной скорости.

unsigned int sysHi, sysLo;

// ... create sound, play sound paused ...

// Seek the data to the desired start offset
channel->setPosition(50000, FMOD_TIMEUNIT_PCM);

// For accurate sample playback get the current system "tick"
system->getDSPClock(&sysHi, &sysLo);

// Set start offset to a couple of "mixes" in the future, 2048 samples is far enough in the future to avoid issues with mixer timings
FMOD_64BIT_ADD(sysHi, sysLo, 0, 2048);
channel->setDelay(FMOD_DELAYTYPE_DSPCLOCK_START, sysHi, sysLo);

// Set end offset for 50,000 samples from our start time, which means the end sample will be 100,000
FMOD_64BIT_ADD(sysHi, sysLo, 0, 50000);
channel->setDelay(FMOD_DELAYTYPE_DSPCLOCK_END, sysHi, sysLo);

// ... unpause sound ...
1 голос
/ 27 февраля 2010

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

Вариант 1: при создании потока установите lenbytes на четный делитель количества кадров, которые вы хотите воспроизвести. В вашем примере установите «lenbytes» на 5000, затем сохраните счетчик в обратном вызове. Когда вы доберетесь до 10, остановите поток.

Вариант 2: используйте FSOUND_Stream_AddSyncPoint с pcmoffset, установленным на желаемую точку остановки. Зарегистрируйте обратный звонок с помощью FSOUND_Stream_SetSyncCallback. Остановите поток в обратном вызове.

...