Merge pull request #15 from andreja6/sound
Added sound and sound effects
This commit is contained in:
+113
@@ -0,0 +1,113 @@
|
||||
#include "AudioPlayer.h"
|
||||
#include "SDL.h"
|
||||
#include "SDL_audio.h"
|
||||
#include <stdlib.h>
|
||||
#include <malloc.h>
|
||||
#include <string.h>
|
||||
#define NUM_SOUNDS 10
|
||||
static SDL_AudioSpec fmt;
|
||||
static bool initiated = false;
|
||||
|
||||
AudioPlayer::AudioPlayer(void)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
AudioPlayer::~AudioPlayer(void)
|
||||
{
|
||||
SDL_CloseAudio();
|
||||
}
|
||||
|
||||
void AudioPlayer::init()
|
||||
{
|
||||
initiated = true;
|
||||
extern void mixaudio(void *unused, Uint8 *stream, int len);
|
||||
fmt.freq = 22050;
|
||||
fmt.format = AUDIO_S16;
|
||||
fmt.channels = 2;
|
||||
fmt.samples = 1024; /* A good value for games */
|
||||
fmt.callback = mixaudio;
|
||||
fmt.userdata = NULL;
|
||||
|
||||
/* Open the audio device and start playing sound! */
|
||||
if ( SDL_OpenAudio(&fmt, NULL) < 0 ) {
|
||||
fprintf(stderr, "Unable to open audio: %s\n", SDL_GetError());
|
||||
exit(1);
|
||||
}
|
||||
SDL_PauseAudio(0);
|
||||
}
|
||||
|
||||
static 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 > (Uint32)len ) {
|
||||
amount = len;
|
||||
}
|
||||
SDL_MixAudio(stream, &sounds[i].data[sounds[i].dpos], amount, SDL_MIX_MAXVOLUME);
|
||||
sounds[i].dpos += amount;
|
||||
}
|
||||
}
|
||||
|
||||
void AudioPlayer::PlaySound(std::string fileString)
|
||||
{
|
||||
|
||||
if(initiated)
|
||||
{
|
||||
char *file = new char[fileString.length() + 1];
|
||||
strcpy(file, fileString.c_str());
|
||||
|
||||
|
||||
int index;
|
||||
SDL_AudioSpec wave;
|
||||
Uint8 *data;
|
||||
Uint32 dlen;
|
||||
SDL_AudioCVT cvt;
|
||||
|
||||
/* Look for an empty (or finished) sound slot */
|
||||
for ( index=0; index<NUM_SOUNDS; ++index ) {
|
||||
if ( sounds[index].dpos == sounds[index].dlen ) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if ( index == NUM_SOUNDS )
|
||||
return;
|
||||
|
||||
/* Load the sound file and convert it to 16-bit stereo at 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, fmt.freq);
|
||||
cvt.buf = (Uint8*)malloc(dlen*cvt.len_mult);
|
||||
memcpy(cvt.buf, data, dlen);
|
||||
cvt.len = dlen;
|
||||
SDL_ConvertAudio(&cvt);
|
||||
SDL_FreeWAV(data);
|
||||
|
||||
/* Put the sound data in the slot (it starts playing immediately) */
|
||||
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();
|
||||
delete [] file;
|
||||
}
|
||||
else
|
||||
{
|
||||
OutputDebugString("Audio player not initialized, sound will not play\r\n");
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
#include <G3DAll.h>
|
||||
#pragma once
|
||||
|
||||
class AudioPlayer
|
||||
{
|
||||
public:
|
||||
AudioPlayer(void);
|
||||
~AudioPlayer(void);
|
||||
static void PlaySound(std::string);
|
||||
static void init();
|
||||
};
|
||||
@@ -230,6 +230,10 @@
|
||||
Name="Source Files"
|
||||
Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
|
||||
>
|
||||
<File
|
||||
RelativePath=".\AudioPlayer.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\BaseButtonInstance.cpp"
|
||||
>
|
||||
@@ -283,6 +287,10 @@
|
||||
Name="Header Files"
|
||||
Filter="h;hpp;hxx;hm;inl"
|
||||
>
|
||||
<File
|
||||
RelativePath=".\AudioPlayer.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\BaseButtonInstance.h"
|
||||
>
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -16,6 +16,7 @@
|
||||
#include "PhysicalInstance.h"
|
||||
#include "TextButtonInstance.h"
|
||||
#include "ImageButtonInstance.h"
|
||||
#include "AudioPlayer.h"
|
||||
|
||||
|
||||
#if G3D_VER < 61000
|
||||
@@ -36,6 +37,7 @@ static G3D::RealTime messageTime = 0;
|
||||
static G3D::RealTime inputTime = 0;
|
||||
static int FPSVal[8] = {10, 20, 30, 60, 120, 240, INT_MAX,1};
|
||||
static int index = 2;
|
||||
static std::string cameraSound = "";
|
||||
static float TIMERVAL = 60.0F;
|
||||
static int SCOREVAL = 0;
|
||||
static G3D::TextureRef go = NULL;
|
||||
@@ -248,6 +250,7 @@ public:
|
||||
|
||||
void CameraButtonListener::onButton1MouseClick(BaseButtonInstance* button)
|
||||
{
|
||||
AudioPlayer::PlaySound(cameraSound);
|
||||
CoordinateFrame frame = usableApp->debugCamera.getCoordinateFrame();
|
||||
if(button->name == "CenterCam")
|
||||
centerCam = true;
|
||||
@@ -269,6 +272,8 @@ public:
|
||||
|
||||
void DeleteListener::onButton1MouseClick(BaseButtonInstance* button)
|
||||
{
|
||||
|
||||
|
||||
if(selectedInstance != NULL)
|
||||
{
|
||||
for(size_t i = 0; i < instances.size(); i++)
|
||||
@@ -279,6 +284,9 @@ void DeleteListener::onButton1MouseClick(BaseButtonInstance* button)
|
||||
instances.erase(instances.begin() + i);
|
||||
delete deleting;
|
||||
selectedInstance = NULL;
|
||||
AudioPlayer::PlaySound(GetFileInPath("/content/sounds/pageturn.wav"));
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -871,11 +879,13 @@ void Demo::onUserInput(UserInput* ui) {
|
||||
|
||||
if(ui->keyPressed(SDL_MOUSE_WHEEL_UP_KEY))
|
||||
{
|
||||
AudioPlayer::PlaySound(cameraSound);
|
||||
CoordinateFrame frame = app->debugCamera.getCoordinateFrame();
|
||||
cameraPos = cameraPos + frame.lookVector()*2;
|
||||
}
|
||||
if(ui->keyPressed(SDL_MOUSE_WHEEL_DOWN_KEY))
|
||||
{
|
||||
AudioPlayer::PlaySound(cameraSound);
|
||||
CoordinateFrame frame = app->debugCamera.getCoordinateFrame();
|
||||
cameraPos = cameraPos - frame.lookVector()*2;
|
||||
}
|
||||
@@ -1364,6 +1374,7 @@ void App::main() {
|
||||
cursor = Texture::fromFile(GetFileInPath("/content/cursor2.png"));
|
||||
fntdominant = GFont::fromFile(GetFileInPath("/content/font/dominant.fnt"));
|
||||
fntlighttrek = GFont::fromFile(GetFileInPath("/content/font/lighttrek.fnt"));
|
||||
cameraSound = GetFileInPath("/content/sounds/SWITCH3.wav");
|
||||
sky = Sky::create(NULL, ExePath() + "/content/sky/");
|
||||
cursorid = cursor->openGLID();
|
||||
applet->run();
|
||||
@@ -1457,7 +1468,8 @@ LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
|
||||
int main(int argc, char** argv) {
|
||||
//_CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
|
||||
//_CrtSetBreakAlloc(1279);
|
||||
|
||||
try{
|
||||
AudioPlayer::init();
|
||||
GAppSettings settings;
|
||||
settings.window.resizable = true;
|
||||
//settings.window.fsaaSamples = 8;
|
||||
@@ -1549,5 +1561,10 @@ int main(int argc, char** argv) {
|
||||
//messageTime = G3D::System::time();
|
||||
|
||||
app.run();
|
||||
}
|
||||
catch(std::exception)
|
||||
{
|
||||
OnError(-1);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user