[ÀÌÀü] ¸ñÂ÷ [´ÙÀ½]

Simple DirectMedia Layer API »ç¿ëÇϱâ

»ç¿îµå(Sound)

  • ¿Àµð¿À ÀåÄ¡ ¿­±â

¿©·¯ºÐÀº ¿©·¯ºÐÀÇ ¿Àµð¿À µ¥ÀÌŸ¸¦ È¥ÇÕÇÏ°í ±×°ÍÀ» ¿Àµð¿À ½ºÆ®¸²À¸·Î º¸³»´Â Äݹé ÇÔ¼ö¸¦ ¸¸µé¾î¾ß ÇÑ´Ù. ±× ´ÙÀ½¿£, ¿øÇÏ´Â ¿Àµð¿À Æ÷¸Ë°ú ¼Óµµ¸¦ ¼±ÅÃÇÏ°í, ¿Àµð¿À ÀåÄ¡¸¦ ¿¬´Ù.

SDL_PauseAudio(0) ¸¦ È£ÃâÇÒ¶§±îÁö ¿Àµð¿À´Â ½ÇÁ¦·Î Àç»ýµÇÁö ¾Ê´Â´Ù. ÀÌ ÇÔ¼ö´Â ¿©·¯ºÐÀÇ Äݹé ÇÔ¼ö°¡ ½ÇÇàµÇ±â Àü¿¡, (ÇÊ¿äÇÏ´Ù¸é) ´Ù¸¥ ¿Àµð¿À ÃʱâÈ­ÀÛ¾÷À» ¼öÇàÇÒ ¼ö ÀÖµµ·Ï ÇÑ´Ù. »ç¿îµå Ãâ·ÂÀ» ¸¶Ä£ ´ÙÀ½, SDL_CloseAudio() ÇÔ¼ö¸¦ »ç¿ëÇØ ¿Àµð¿À Ãâ·ÂÀ» ´Ý¾Æ¾ß ÇÑ´Ù.

ÆÁ:
¸¸¾à ¿©·¯ºÐÀÇ ¾ÖÇø®ÄÉÀ̼ÇÀÌ ´Ù¸¥ ¿Àµð¿À Æ÷¸ËÀ» ó¸®ÇÒ ¼ö ÀÖ´Ù¸é, µÎ¹ø° SDL_AudioSpec Æ÷ÀÎÅ͸¦ SDL_OpenAudio() ¿¡ º¸³» ½ÇÁ¦ Çϵå¿þ¾î ¿Àµð¿À Æ÷¸ËÀ» ÃëÇϵµ·Ï ÇØ¾ß ÇÑ´Ù. ¸¸¾à µÎ¹ø° Æ÷ÀÎÅ͸¦ NULL·Î ³²°Ü³õ´Â´Ù¸é, ¿Àµð¿À µ¥ÀÌŸ´Â ½ÇÇà½Ã¿¡ Çϵå¿þ¾î ¿Àµð¿À Æ÷¸ËÀ¸·Î º¯È¯µÉ °ÍÀÌ´Ù.
¿¹Á¦:
#include "SDL.h"
#include "SDL_audio.h"
{
    extern void mixaudio(void *unused, Uint8 *stream, int len);
    SDL_AudioSpec fmt;

    /* 16-bit ½ºÅ×·¹¿À ¿Àµð¿À¸¦ 22Khz ·Î ¼³Á¤ÇÑ´Ù. */
    fmt.freq = 22050;
    fmt.format = AUDIO_S16;
    fmt.channels = 2;
    fmt.samples = 512;        /* °ÔÀÓÀ» À§ÇØ Àû´çÇÑ °ª */
    fmt.callback = mixaudio;
    fmt.userdata = NULL;

    /* ¿Àµð¿À ÀåÄ¡¸¦ ¿­°í »ç¿îµå¸¦ Àç»ýÇϱ⠽ÃÀÛÇÑ´Ù! */
    if ( SDL_OpenAudio(&fmt, NULL) < 0 ) {
        fprintf(stderr, "Unable to open audio: %s\n", SDL_GetError());
        exit(1);
    }
    SDL_PauseAudio(0);

    ...

    SDL_CloseAudio();
}
  • »ç¿îµå ·Îµù°ú Àç»ý

SDL Àº »ç¿ëÀÚ ÆíÀǸ¦ À§ÇØ ÇϳªÀÇ »ç¿îµå ·Îµù ·çƾÀÎ SDL_LoadWAV() ¸¦ Á¦°øÇÑ´Ù. »ç¿îµå¸¦ ·ÎµùÇÑ µÚ¿¡ SDL_ConvertAudio() ¸¦ »ç¿ëÇؼ­ »ç¿îµå Ãâ·Â¿¡ ¸Â´Â ¿Àµð¿À Æ÷¸ËÀ¸·Î º¯È¯ÇÏ¿© ¿©·¯ºÐÀÇ È¥ÇÕ(mixing) ÇÔ¼ö¿¡ »ç¿ëµÉ ¼ö ÀÖ°Ô ÇØ¾ß ÇÑ´Ù.

ÆÁ:
SDL ¿Àµð¿À ±â´ÉÀº Àú¼öÁØ ¼ÒÇÁÆ®¿þ¾î ¿Àµð¿À ¹Í¼­¸¦ À§ÇØ ¼³°èµÇ¾ú´Ù. ¿Ïº®ÇÑ ¹Í¼­ ±¸Çö ¿¹Á¦´Â LGPL ¶óÀ̼¾½º ÇÏ¿¡ SDL µ¥¸ð ¸ðÀ½À» ÅëÇØ Á¦°øµÈ´Ù.
¿¹Á¦:
#define NUM_SOUNDS 2
struct sample {
    Uint8 *data;
    Uint32 dpos;
    Uint32 dlen;
} sounds[NUM_SOUNDS];

void mixaudio(void *unused, Uint8 *stream, int len)
{
    int i;
    Uint32 amount;

    for ( i=0; i<NUM_SOUNDS; ++i ) {
        amount = (sounds[i].dlen-sounds[i].dpos);
        if ( amount > len ) {
            amount = len;
        }
        SDL_MixAudio(stream, &sounds[i].data[sounds[i].dpos], amount, SDL_MIX_MAXVOLUME);
        sounds[i].dpos += amount;
    }
}

void PlaySound(char *file)
{
    int index;
    SDL_AudioSpec wave;
    Uint8 *data;
    Uint32 dlen;
    SDL_AudioCVT cvt;

    /* ºñ¾îÀÖ´Â(¶Ç´Â ³¡³­) »ç¿îµå ½½·ÔÀ» ã´Â´Ù. */
    for ( index=0; index<NUM_SOUNDS; ++index ) {
        if ( sounds[index].dpos == sounds[index].dlen ) {
            break;
        }
    }
    if ( index == NUM_SOUNDS )
        return;

    /* »ç¿îµå ÆÄÀÏÀ» ·ÎµåÇÏ¿© 22kHzÀÇ 16-bit ½ºÅ×·¹¿À·Î º¯È¯ÇÑ´Ù. */
    if ( SDL_LoadWAV(file, &wave, &data, &dlen) == NULL ) {
        fprintf(stderr, "Couldn't load %s: %s\n", file, SDL_GetError());
        return;
    }
    SDL_BuildAudioCVT(&cvt, wave.format, wave.channels, wave.freq,
                            AUDIO_S16,   2,             22050);
    cvt.buf = malloc(dlen*cvt.len_mult);
    memcpy(cvt.buf, data, dlen);
    cvt.len = dlen;
    SDL_ConvertAudio(&cvt);
    SDL_FreeWAV(data);

    /* »ç¿îµå µ¥ÀÌŸ¸¦ ½½·Ô¿¡ ³Ö´Â´Ù(°ð¹Ù·Î Àç»ýµÈ´Ù). */
    if ( sounds[index].data ) {
        free(sounds[index].data);
    }
    SDL_LockAudio();
    sounds[index].data = cvt.buf;
    sounds[index].dlen = cvt.len_cvt;
    sounds[index].dpos = 0;
    SDL_UnlockAudio();
}

[ÀÌÀü] ¸ñÂ÷ [´ÙÀ½]