[Cocoa] NSSound를 통한 초간단 사운드 재생

코코아에는 소리를 재생할 수 있는 NSSound 클래스가 있다. NSSound는 소리 재생을 위한 작업을 극도로 단순화하는 클래스로 인스턴스 메소드를 사용하는 것만으로 간단히 사운드를 재생할 수 있다. NSSound는 AIFF, WAV, NextSND 포맷을 재생할 수 있다. 음향 데이터는 디스크 상의 파일이나, 네트워크상의 URL, 페이스트 보드에 복사한 데이터가 될 수 있다. 또한 시스템에서 사용하는 사운드는 경로가 아닌 이름으로 재생이 가능하다. 이러한 시스템 사운드는 /Library/Sounds 디렉토리에 저장되어 있다.

NSSound는 음향 데이터를 여러 방법으로 로딩할 수 있다. 기본적으로 시스템 라이브러리에 등록되어 있는 소리, 파일의 경로, URL 등으로부터 사운드를 로딩할 수 있다. 로딩된 사운드에 대해 시작 / 일시정지 / 일시정지후 재생 / 정지 등의 기본적인 playback 기능이 제공된다.  또한 NSSound는 델리게이트 메소드를 사용하여 사운드의 재생이 끝나는 시점에 특정한 동작을 실행할 수 있다.

이름으로 로딩하기

NSSound *mySound = [NSSound soundNamed:@"Temple"];

파일로부터 로딩하기

 
NSSound *mySound = [ initWithContentsOfFile:mySoundFilePath]

사운드 파일을 열려면 open panel 을 사용하면 된다.

-(IBAction)openSoundFilePanel
{
    int result;
    NSOpenPanel *panel = ;
    NSArray *filesToOpen;
    NSString *theFilename;
    NSMutableArray *fileTypes = ;

    ;
    result = ;

    if(result == NSOKButton) {
        filesToOpen = ;
        theFilename = [filesToOpen objectAtIndex:0];

        [self _loadSoundFromPath:theFilename];
        // 이미 정의해둔 재생 메소드
    }
}

URL로부터 로딩하기 – 파일시스템의 URL만이 적용 가능하다.

 NSSound *mySound = [ initWithContentOfURL:mySoundURL byReference:NO];

파일의 재생

-play, -pause, -resume, -stop 의 메소드를 보낸다. 파일의 재생이 완료되면 -sound:didFinishPlaying: 이 호출된다.
반복재생의 경우에는 loop 프로퍼티를 YES로 주면 된다. 음량은 0.0~1.0 사이의 값으로 줄 수 있다.

재생 프로그레스

전체 시간과 현재 재생 지점도 알 수 있다. -currentTime, -duration을 사용하면 된다. 타이머를 사용하며 매 순간의 현재 재생 위치를 표시하는 것이 가능하다.

아이폰에서는  이처럼 단순화된 클래스는 아직 존재하지 않는듯하다. 코어 오디오를 사용해서 재생해야 한다. 코어오디오는 iOS/OSX에서 음향을 다루는 총체적인 기능을 제공하는 프레임워크로 믹싱, 이퀄라이저 등을 내장하고 있으며 음질의 영향을 주지 않으면서 배터리 수명을 향상 시키는 기술이 적용되어 있다.