Merge pull request #15 from andreja6/sound

Added sound and sound effects
This commit is contained in:
andreja6
2018-04-27 09:19:54 -07:00
committed by GitHub
12 changed files with 150 additions and 1 deletions

113
AudioPlayer.cpp Normal file
View File

@@ -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");
}
}

11
AudioPlayer.h Normal file
View File

@@ -0,0 +1,11 @@
#include <G3DAll.h>
#pragma once
class AudioPlayer
{
public:
AudioPlayer(void);
~AudioPlayer(void);
static void PlaySound(std::string);
static void init();
};

View File

@@ -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.

BIN
content/sounds/SWITCH3.wav Normal file

Binary file not shown.

BIN
content/sounds/pageturn.wav Normal file

Binary file not shown.

View File

@@ -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;
}