You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdemultimedia/mpeglib/lib/util/audio/audioIO_SDL.cpp

165 lines
3.1 KiB

/*
audio wrapper for SDL
Copyright (C) 2000 Martin Vogt
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU Library General Public License as published by
the Free Software Foundation.
For more information look at the file COPYRIGHT in this package
*/
#include "../../input/bufferInputStream.h"
#include <assert.h>
#include <iostream.h>
#if defined WIN32
#include <SDL.h>
#include <SDL_audio.h>
#else
#include <SDL/SDL.h>
#include <SDL/SDL_audio.h>
#endif
//static SDL_AudioSpec actual;
static BufferInputStream* audioRing;
static TimeStamp* dummy;
static int lOpen=false;
int audioConstruct() {
cout << "audioConstruct ********* SDL"<<endl;
if ( SDL_Init(SDL_INIT_AUDIO) < 0 ) {
fprintf(stderr, "Warning: Couldn't init SDL audio: %s\n",
SDL_GetError());
exit(0);
}
atexit(SDL_Quit);
audioRing=new BufferInputStream(1024*65,1024*8,"audioSDL");
audioRing->open("audioSDL");
dummy=new TimeStamp();
lOpen=false;
return true;
}
void audioDestruct() {
delete audioRing;
delete dummy;
}
int audioOpen() {
return true;
}
void audioClose() {
lOpen=false;
SDL_CloseAudio();
}
void audioCallback(void *, Uint8 *stream, int len) {
char* startPtr;
TimeStamp* start;
int bytePos;
int read=audioRing->readRemote(&startPtr,len);
SDL_MixAudio(stream, (Uint8*) startPtr, read, SDL_MIX_MAXVOLUME);
audioRing->forwardReadPtr(read);
// dequeue time stamps
bytePos=audioRing->getBytePosition();
start=audioRing->getTimeStamp(bytePos);
}
void audioInit(int sampleSize,int frequency, int stereo, int sign, int big) {
if( sign == 0 )
{
fprintf(stderr,
"%s, %d: expecting signed audio data, "
"initialized unsigned (ignored)\n",
__FILE__, __LINE__ );
}
if( big != 0 )
{
fprintf(stderr,
"%s, %d: expecting little endian audio data, "
"initialized big endian (ignored)\n",
__FILE__, __LINE__ );
}
cout << "SDL audioInit: "
<< " sampleSize:"<<sampleSize
<< " frequency:"<<frequency
<< " stereo:"<<stereo<<endl;
if (lOpen==true) {
cout << "SDL is buggy, because open != init -> return"<<endl;
return;
}
lOpen=true;
SDL_AudioSpec wanted;
//SDL_AudioSpec actual;
if (sampleSize == 16) {
wanted.format= AUDIO_S16LSB;
} else {
wanted.format= AUDIO_S8;
}
wanted.freq=frequency;
wanted.channels=stereo+1;
wanted.samples = 1024;
wanted.callback = audioCallback;
wanted.userdata = NULL;
int err=SDL_OpenAudio(&wanted, NULL);
if (err != 0) {
cout << "SDL_OpenAudio not ok"<<endl;
cout << "error is:"<<SDL_GetError()<<endl;
exit(0);
}
SDL_PauseAudio(0);
}
int mixerOpen() {
return true;
}
void mixerClose() {
}
void mixerSetVolume(int volumeLeft,int volumeRight) {
cout << "volumeLeft:"<<volumeLeft
<< " volumeRight:"<<volumeRight<<endl;
}
int audioWrite(char *buffer, int count) {
audioRing->write(buffer,count,dummy);
return count;
}
int getAudioFd() {
return false;
}
int getAudioBufferSize() {
int buf=1024*65;
return buf;
}