2013-01-07 2 views
1

Audio Toolbox를 사용하여 .wav 파일을 재생하려고합니다. 나는 지금까지 이것을 가지고있다 : 그러나 나의 파일은 재생되지 않을 것이다. If 조건은 오른쪽으로 트리거되지만 재생되지는 않습니다. 그러나 파일이 없으면 오류 메시지가 인쇄됩니다. 무엇이 잘못 되었는가?Audio Toolbox로 .wav를 재생하십시오.

-(void) playSound : (NSString *) fName : (NSString *) ext 
{ 

    SystemSoundID audioEffect; 
    NSString *path = [[NSBundle mainBundle] pathForResource : fName ofType :ext]; 
    if ([[NSFileManager defaultManager] fileExistsAtPath : path]) 
    { 
     NSURL *pathURL = [NSURL fileURLWithPath : path]; 
     AudioServicesCreateSystemSoundID((__bridge CFURLRef) pathURL, &audioEffect); 
     AudioServicesPlaySystemSound(audioEffect); 
    } 
    else 
    { 
     NSLog(@"error, file not found: %@", path); 
    } 
    AudioServicesDisposeSystemSoundID(audioEffect);; 
} 
+0

'AudioServicesCreateSystemSoundID'에 의해 반환 된'OSStatus'의 값은 무엇입니까? 사용중인 WAV 파일의 출처는 무엇입니까? LPCM 또는 다른 호환 가능한 형식의 샘플이 포함되어 있는지 확인 하시겠습니까? 메소드의 끝 부분에서 사운드 ID를 처리하지 않으면 어떻게됩니까? – warrenm

+0

@warrenm 나는 그 라인을 지웠고 효과가 있었다. 고마워. 하지만 ARC는 메모리를 자동으로 폐기합니까? –

답변

1

사운드 ID를 재생하라는 메시지가 표시되면 즉시 삭제할 수 없습니다. 그러면 재생이 중지됩니다. 그래서 처음에는 듣지 못했습니다.

대신 수행해야하는 작업은 만드는 모든 객체 (예 :보기 컨트롤러)의 속성에있는 ID에 대한 참조를 보유하는 것입니다.

AudioServicesCreateSystemSoundID((__bridge CFURLRef) pathURL, &_audioEffect); 

이것은 단지 당신이 제대로에 처분을 허용하지 않습니다 : 당신은 당신의 인터페이스 선언에서 다음과 같이 선언 것 :

@property(nonatomic, assign) SystemSoundID audioEffect; 

... 그리고 이후 이런 식으로 할당 (예 : viewDidUnload), 나중에 각 디스크를 재생할 때마다 디스크에서 파일을 읽지 않아도됩니다. 각 ID는 무제한 재생할 수 있기 때문에 타임스.

마지막 힌트 : 문자열을 요청한 다음 URL로 변환하는 대신 번들 리소스의 URL을 직접 요청할 수 있습니다.

NSURL *audioURL = [[NSBundle mainBundle] URLForResource:fName withExtension:ext]; 
if([[NSFileManager defaultManager] fileExistsAtPath:[audioURL path]]) 
    // ... 
1

나는 워렌의 의견에서 그것을 알아 낸 것이다. 마지막 줄을 삭제해야했습니다. 재생을 시작한 후 밀리 초를 죽이기 때문에 소리를들을 수 없습니다.

관련 문제