воспроизведение только части звука с помощью FMOD

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

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


person Yuvi Masory    schedule 26.02.2010    source источник


Ответы (3)


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

Ознакомьтесь с документацией по Channel::setDelay, FMOD_DELAYTYPE, System::getDSPClock.

person Pete    schedule 25.03.2010

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

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

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

person AShelly    schedule 26.02.2010
comment
Спасибо за это. Просто чтобы подтвердить, что оба эти метода неточны, верно? Они зависят от того, когда точно достигается код остановки потока. Нет никакого способа сыграть точно определенный интервал? - person Yuvi Masory; 27.02.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 ...
person Mathew Block    schedule 26.07.2010