The OpenNET Project / Index page

[ новости/++ | форум | wiki | теги ]

Каталог документации / Раздел "Программирование, языки" / Оглавление документа

[ Назад ] Содержание [ Дальше ]

Использование Simple DirectMedia Layer API

Звук

  • Открытие аудио устройства

Вам необходима callback-функция, которая будет смешивать ваши аудио данные и помещать их в аудио поток. Затем необходимо выбрать желательный аудио формат и частоту, и открыть аудио устройство.

Воспроизведение не начнется до тех пор, пока вы не вызовете SDL_PauseAudio(0). Эта функция позволяет выполнить действия, которые необходимо выполнить до вызова CallBack функции. Как только вы завершите использование звука, закройте его функцией 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бит стерео с 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, "Не могу открыть аудио: %s\n", SDL_GetError());



        exit(1);



    }



    
SDL_PauseAudio(0);



 


    ...



 


    
SDL_CloseAudio();


}

 

  • Загрузка и воспроизведение звука

Для вашего удобства, SDL предоставляет единственную функцию для загрузки звука, SDL_LoadWAV(). После того, как вы загрузили звук, вы должны преобразовать его к звуковому формату выходного потока с помощью функции SDL_ConvertAudio(), и сделать его доступным для вашей функции микширования.

Совет:
Устройства SDL audio предназначены для низкоуровневого программного аудио микшера. Хорошую реализацию такого микшера, доступную по LGPL лицензии, можно найти в архиве SDL demos.

 

Пример :


 

#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;
 
    
/* Открыть аудио файл и конвертировать его в 16-bit stereo 22kHz */
    
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();


}

[ Назад ] Содержание [ Дальше ]


  Закладки на сайте
  Проследить за страницей
Created 1996-2018 by Maxim Chirkov  
ДобавитьПоддержатьВебмастеруГИД  
Hosting by Ihor