[이전] 목차 [다음]

Simple DirectMedia Layer API 사용하기

CD-ROM 오디오

  • 사용하기 위해 시디롬 드라이브를 열기

SDL_CDNumDrives() 함수를 통해 시스템에서 사용할 수 있는 시디롬 드라이브 갯수를 알 수 있으며, SDL_CDOpen() 를 사용해서 그 중 하나를 사용할 수 있다.

시스템 디폴트 시디롬은 항상 드라이브 0 이다. 만약 드라이브에 디스크가 없더라도 사용하기 위해 드라이브를 열 수 있다.

SDL_CDStatus() 함수를 사용해서 드라이브의 상태를 확인해야 한다. 시디롬 드라이브의 사용을 마쳤다면 SDL_CDClose() 함수를 사용해서 닫는다.

팁:
SDL_CDName() 함수를 사용해서 시디롬 드라이브의 시스템 독립적인 이름을 얻을 수 있다.
예제:
{
    SDL_CD *cdrom;

    if ( SDL_CDNumDrives() > 0 ) {
        cdrom = SDL_CDOpen(0);
        if ( cdrom == NULL ) {
            fprintf(stderr, "Couldn't open default CD-ROM: %s\n" SDL_GetError());
            return;
        }

        ...

        SDL_CDClose(cdrom);
    }
}
  • 시디롬 재생하기

시디롬 드라이브는 MSF 포맷(분/초/프레임, mins/secs/frames) 또는 직접적으로 프레임을 사용해서 시간을 지정한다. 한 프레임은 시디 시간의 표준 단위이며, 1/75 초에 해당한다. SDL 은 트랙길이와 오프셋을 지정할 때 MSF 포맷 대신에 프레임을 사용하지만, FRAMES_TO_MSF() 과 MSF_TO_FRAMES() 매크로를 사용해서 변환할 수 있다.

SDL 은 SDL_CDStatus() 를 호출할 때까지 SDL_CD 구조의 트랙 정보를 갱신하지 않기 때문에, 항상 시디를 재생하기 전에 SDL_CDStatus() 를 사용해서 드라이브에 시디가 있는지 또, 어떤 트랙이 가용한지를 확인해야 한다. 트랙 인덱스는 첫번째 트랙이 0 부터 시작한다는 것을 주의하자.

SDL 은 시디롬을 재생하기 위해 두가지 함수를 제공한다. SDL_CDPlayTracks() 를 사용해서 시디상의 특정 트랙을 재생할 수도 있고 SDL_CDPlay() 를 사용해서 절대 프레임 오프셋을 재생할 수도 있다.

SDL은 시디삽입 또는 재생완료를 자동으로 감지하는 기능을 제공하지 않는다. 이러한 상황을 감지하기 위해서는, SDL_CDStatus() 를 사용해 주기적으로 드라이브의 상태를 확인해야 한다. 이 함수들이 시디의 목차를 읽기 때문에 짧은 루프안에서 계속적으로 호출되지 않도록 해야 한다.

팁:
여러분은 cdrom->tracks[track].type 를 보고 SDL_AUDIO_TRACK 인지 SDL_DATA_TRACK 인지 비교하여 어떤 트랙이 오디오 트랙이며 어떤 트랙이 데이타 트랙인지 확인해야 한다.
예제:
void PlayTrack(SDL_CD *cdrom, int track)
{
    if ( CD_INDRIVE(SDL_CDStatus(cdrom)) ) {
        SDL_CDPlayTracks(cdrom, track, 0, track+1, 0);
    }
    while ( SDL_CDStatus(cdrom) == CD_PLAYING ) {
        SDL_Delay(1000);
    }
}

[이전] 목차 [다음]