2010-02-26 6 views
1

FMOD를 사용하여 사운드의 일부만 재생하려고합니다 (예 : 200000 프레임 파일의 50000-100000 프레임). 앞으로 (예 : 프레임 50000에서 재생을 시작하는) 몇 가지 방법을 찾았지만 사운드가 100000에서 멈추지 않게하는 방법을 찾지 못했습니다. FMOD가 기본적으로 추가 할 필요없이이 작업을 수행 할 수있는 방법이 있습니까? lbsndfile 또는 그와 유사한 그림?FMOD를 사용하여 사운드의 일부만 재생

스트리밍 옵션을 사용하고 있음을 언급해야합니다. 나는이 소리가 임의로 크고 편안하게/빠르게 메모리에로드 될 수 없다고 가정해야합니다.

답변

4

정확한 사운드 시작 및 정지 샘플을 보려면 Channel :: setDelay를 사용할 수 있습니다. FMOD_DELAYTYPE_DSPCLOCK_START를 사용하여 사운드의 시작 시간을 설정하고 FMOD_DELAYTYPE_DSPCLOCK_END을 사용하여 종료 시간을 설정하십시오.

Channel :: setDelay, FMOD_DELAYTYPE, System :: getDSPClock에 대한 문서를 확인하십시오.

1

원하는 지점에 도달하면 스트리밍 콜백을 사용하여 스트림을 중지 할 수 있어야합니다.

옵션 1 : 스트림을 만들 때 lenbytes을 재생할 프레임 수의 짝수 제수로 설정하십시오. 귀하의 예제에서 'lenbytes'를 5000으로 설정 한 다음 콜백에 카운터를 유지하십시오. 10 점에 도달하면 시내를 중지하십시오.

옵션 2 : FSOUND_Stream_AddSyncPointpcmoffset을 원하는 정지 지점으로 설정하십시오. FSOUND_Stream_SetSyncCallback으로 콜백을 등록하십시오. 콜백에서 스트림을 중지하십시오.

+0

감사합니다. 확인하기 위해이 두 가지 방법 모두 정확하지 않습니까? 그들은 언제 * 정지 스트림 코드에 도달했는지에 달려 있습니다. 일정한 간격을 정확하게 재생할 방법이 없습니까? –

1

샘플 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 ... 
관련 문제