1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148
|
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <SDL.h>
#include <SDL_ttf.h>
#include <SDL/SDL_image.h>
#include <SDL_mixer.h>
#include <SDL_sound.h>
void audioCallBack(void *udata, Uint8 *stream, int len);
/* http://loka.developpez.com/tutoriel/sdl */
typedef struct sUserData
{
Uint32* audioLen;
Uint32* audioPos;
Uint32* audioSize;
Uint8 *audioBuffer;
}SUserData;
int main ( int argc, char** argv )
{
SDL_Surface* screen;
SDL_Surface *message = NULL;
SDL_Surface* bmp;
SDL_Rect dstrect;
unsigned short i=0;
int done = 0;
char ch[20];
TTF_Font *font;
SDL_Event event;
SDL_Color textColor = { 255, 255, 255 };
SDL_AudioSpec audioSortie,audioExacte;
SDL_AudioSpec audioBufferSpec;
Uint8 *audioBuffer;
Uint32 audioBufferLen;
Uint32 audioLen, audioPos;
SUserData *userData;
SDL_AudioCVT cvt;
// initialize SDL video
if ( SDL_Init( SDL_INIT_VIDEO | SDL_INIT_AUDIO) < 0 )
{ /* pour l'image pour le son */
printf( "Unable to init SDL: %s\n", SDL_GetError() );
return 1;
}
// make sure SDL cleans up before exit
atexit(SDL_Quit);
// Définition des propriétés audio
audioSortie.freq = 22050;
audioSortie.format = AUDIO_S16;
audioSortie.channels = 2;
audioSortie.samples = 1024;
audioSortie.callback =audioCallBack;
userData = malloc (sizeof (*userData));
audioSortie.userdata = userData;
// Initialisation de la couche audio
if (SDL_OpenAudio(&audioSortie, &audioExacte) < 0)
{
fprintf(stderr, "Erreur d'ouverture audio: %s\n", SDL_GetError());
return (-1);
}
// A inclure dans votre code pour charger un fichier sonore dans audioBuffer
if(!SDL_LoadWAV("test_son1/high.wav", &audioBufferSpec, &audioBuffer, &audioBufferLen))
{
printf("Erreur lors du chargement du fichier WAV.\n");
fprintf (stderr, "%s\n", SDL_GetError ());
return 1;
}
SDL_BuildAudioCVT(&cvt, audioBufferSpec.format, audioBufferSpec.channels, audioBufferSpec.freq, AUDIO_S16, 2, 22050);
cvt.buf = malloc(audioBufferLen*cvt.len_mult);
memcpy(cvt.buf, audioBuffer, audioBufferLen);
cvt.len = audioBufferLen;
SDL_ConvertAudio(&cvt);
SDL_FreeWAV(audioBuffer);
userData->audioLen = &audioLen;
userData->audioPos = &audioPos;
userData->audioSize = &audioBufferLen;
fprintf (stderr , "%p\n", audioBuffer);
userData->audioBuffer = audioBuffer;
printf("Propriétés du fichier audio %d : %d canaux, %d fréquence %d octets.\n",
audioBufferSpec.format & 0xff, audioBufferSpec.channels, audioBufferSpec.freq, audioBufferLen);
// Lancement de la lecture
SDL_PauseAudio(0);
// Attendre que la lecture du son soit terminée
audioLen=audioBufferLen;
while ( audioLen > 0 )
{
SDL_Delay(100);
}
// Fermeture du module
SDL_CloseAudio();
return 0;
}
void audioCallBack(void *udata, Uint8 *stream, int len)
{
SUserData *user = udata;
printf ("Here data %d %d %d - %d\n",
*(user->audioLen),
*(user->audioPos),
*(user->audioSize),
len);
Uint32 *audioLen = user->audioLen;
Uint32 *audioPos = user->audioPos;
Uint32 *audioSize = user->audioSize;
// On ne lit que s'il reste des données à jouer
if ( *audioLen == 0 )
return;
// Remise à zéro du tampon de sortie
memset(stream, 0, len);
fprintf (stderr , "%p\n", user->audioBuffer);
// Lecture du buffer audio
if (*audioPos < *audioSize) {
if (*audioPos + len > *audioSize)
{
len = *audioSize - *audioPos;
}
SDL_MixAudio(stream, user->audioBuffer + *audioPos, len, SDL_MIX_MAXVOLUME);
*audioPos += len;
}
// Décrémentation de ce qu'il reste à lire
if (*audioLen > len)
*audioLen -= len;
else
*audioLen = 0;
} |
Partager