2012-08-02 2 views
2

버튼을 누를 때 사운드를 재생하려고하는데, iOS 5 파일 플레이어 오디오 장치를 사용하고 있습니다.ScheduledAudioFileRegion을 다시 시작하도록 설정하십시오.

파일 선수는 ScheduledAudioFileRegion를 사용하여 오디오를 재생하고

나는 버튼을 누를 때마다 처음부터 소리를 재생하려면이 파일 플레이어를 어떻게 알 수
ScheduledAudioFileRegion rgn; 
memset (&rgn.mTimeStamp, 0, sizeof(rgn.mTimeStamp)); 
rgn.mTimeStamp.mFlags = kAudioTimeStampSampleTimeValid; 
rgn.mTimeStamp.mSampleTime = 0; 
rgn.mCompletionProc = NULL; 
rgn.mCompletionProcUserData = NULL; 
rgn.mAudioFile = audioFile; 
rgn.mLoopCount = INT_MAX; 
rgn.mStartFrame = 0; 
rgn.mFramesToPlay = nPackets * fileASBD.mFramesPerPacket; // plays entire file. 

을 필요한만큼 프레임을 재생되도록 예약 할 수 있습니다 또는 매번 새로운 영역을 만들고 그것을 memset해야합니까? 처음부터 끝까지 버튼을 눌렀을 때 사운드가 재생되기를 원하지만 버튼을 다시 탭하면 파일이 현재 재생 중일 때도 처음부터 시작해야합니다. 이것이 파일 플레이어 오디오 장치로 가능합니까?

+0

'INT_MAX'를 사용하여 불명확 한 루핑을 할 필요가 없습니다. 'mLoopCount'를 -1로 설정하면 영역이 무한 루프됩니다. –

+0

버튼을 눌렀을 때 사운드 파일을 재생하거나, 그 이상의 것을 원합니까? 사운드 파일을 겹쳐서 방아쇠를 당기고 효과를 추가 할 수 있습니까? 단지 간단한 트리거 일 뿐이라면, [AudioServicesPlaySystemSound]를 사용하는 것이 훨씬 더 쉽습니다 [here] (http://stackoverflow.com/a/2778996/172218). AudioUnits는 단순한 사운드 파일 트리거링에 과도합니다. –

+0

코어 오디오 오디오 장치를 사용하여 사운드를 캡처하고 하위 그래프가있는 오 그래프도 만듭니다. 메인 믹스에서 트리거 된 사운드를 캡처해야합니다. – jarryd

답변

1

재생하기 전에 UIButton에서 Stop 액션을 트리거 할 수는 없습니까?

+1

내가 물어볼 수 있다면 어떻게해야합니까? 더 높은 수준의 프레임 워크를 통해 코드 리디렉션없이 최대한의 응답 성이 필요합니다. 핵심 오디오를 사용하고 있습니다. – jarryd

3

AudioUnitReset으로 전화를 걸어 재생을 중지 한 후 다시 재생하십시오.

// Reset 
AudioUnitReset(filePlayerUnit, kAudioUnitScope_Global, 0); 
// Prime (have to do this before every play call.) 
UInt32 defaultVal = 0; 
AudioUnitSetProperty(filePlayerUnit, 
        kAudioUnitProperty_ScheduledFilePrime,     
        kAudioUnitScope_Global, 
        0, 
        &defaultVal, 
        sizeof(defaultVal)); 
// Play (again) 
AudioUnitSetProperty(_playerUnit, 
        kAudioUnitProperty_ScheduleStartTimeStamp, 
        kAudioUnitScope_Global, 
        0, 
        &startTime, 
        sizeof(startTime)); 

당신은 이미이 지역에 타임 스탬프를 가지고 : 사용자가 버튼을 누를 때마다 (. 또는 근처에 차이가 없기 때문에)

이 작업을 수행 즉시 발생합니다. 당신은 그 필요하지만, 당신은 또한 AudioTimeStamp 만들 수 있습니다

AudioTimeStamp startTime; 
memset(&startTime, 0, sizeof(startTime)); 
startTime.mFlags = kAudioTimeStampSampleTimeValid; 
startTime.mSampleTime = -1; 

이를 만들고 처음 플레이 호출하기 전에, 위의 첫 번째 조각에서 관련하는 SetProperty를 호출합니다.

+0

감사합니다 Tim, 이것 좀 봐. – jarryd

+0

나는 또한 다시 지역을 설정해야했다! – Renetik

관련 문제