Ver código fonte

Audio Sample

Add an audio sample to the browser.
Update all projects files for all platforms.
Nick Landry 11 anos atrás
pai
commit
25a89b3a46

+ 2 - 0
samples/browser/CMakeLists.txt

@@ -3,6 +3,8 @@ set(GAME_NAME sample-browser)
 set(GAME_SRC
     src/Audio3DSample.cpp
     src/Audio3DSample.h
+    src/AudioSample.cpp
+    src/AudioSample.h
     src/BillboardSample.cpp
     src/BillboardSample.h
     src/FirstPersonCamera.cpp

+ 1 - 0
samples/browser/android/jni/Android.mk

@@ -28,6 +28,7 @@ LOCAL_SRC_FILES := ../../../gameplay/src/gameplay-main-android.cpp \
     Sample.cpp \
     SamplesGame.cpp \
     Audio3DSample.cpp \
+    AudioSample.cpp \
     BillboardSample.cpp \
     FontSample.cpp \
     FormsSample.cpp \

+ 69 - 0
samples/browser/res/common/audio/background.form

@@ -0,0 +1,69 @@
+form backgroundControls
+{
+    layout = LAYOUT_VERTICAL
+    alignment = ALIGN_VCENTER_LEFT
+    size = 270, 430
+
+    label title
+    {
+        text = Background Music
+        fontSize = 32
+    }
+
+    button playButton
+    {
+        text = Play
+        size = 250, 50
+    }
+
+    button pauseButton
+    {
+        text = Pause
+        size = 250, 50
+    }
+
+    button resumeButton
+    {
+        text = Resume
+        size = 250, 50
+    }
+
+    button rewindButton
+    {
+        text = Rewind
+        size = 250, 50
+    }
+
+    button stopButton
+    {
+        text = Stop
+        size = 250, 50
+    }
+
+    checkbox loopCheckBox
+    {
+        text = Loop Audio
+    }
+
+	slider gainSlider
+	{
+		width = 250
+		orientation = HORIZONTAL
+		min = 0
+		max = 1
+		value = 0
+		text = Gain
+		valueTextVisible = false
+	}
+
+	slider pitchSlider
+	{
+		width = 250
+		orientation = HORIZONTAL
+		min = 0.1
+		max = 5
+		value = 1
+		text = Pitch
+		valueTextVisible = false
+	}
+}

BIN
samples/browser/res/common/audio/background_track.ogg


+ 51 - 0
samples/browser/res/common/audio/braking.form

@@ -0,0 +1,51 @@
+form brakeControls
+{
+    layout = LAYOUT_VERTICAL
+    alignment = ALIGN_VCENTER_HCENTER
+    size = 270, 430
+
+    label titleBraking
+    {
+        text = Sound Effect #1
+        fontSize = 32
+    }
+
+    button playBrakingButton
+    {
+        text = Play
+        size = 250, 50
+    }
+
+    button stopBrakingButton
+    {
+        text = Stop
+        size = 250, 50
+    }
+
+    checkbox loopBrakingCheckBox
+    {
+        text = Loop Audio
+    }
+
+	slider gainBrakingSlider
+	{
+		width = 250
+		orientation = HORIZONTAL
+		min = 0
+		max = 1
+		value = 0
+		text = Gain
+		valueTextVisible = false
+	}
+
+	slider pitchBrakingSlider
+	{
+		width = 250
+		orientation = HORIZONTAL
+		min = 0.1
+		max = 5
+		value = 1
+		text = Pitch
+		valueTextVisible = false
+	}
+}

BIN
samples/browser/res/common/audio/braking.wav


+ 51 - 0
samples/browser/res/common/audio/engine.form

@@ -0,0 +1,51 @@
+form engineControls
+{
+    layout = LAYOUT_VERTICAL
+    alignment = ALIGN_VCENTER_RIGHT
+    size = 270, 430
+
+    label titleEngine
+    {
+        text = Sound Effect #2
+        fontSize = 32
+    }
+
+    button playEngineButton
+    {
+        text = Play
+        size = 250, 50
+    }
+
+    button stopEngineButton
+    {
+        text = Stop
+        size = 250, 50
+    }
+
+    checkbox loopEngineCheckBox
+    {
+        text = Loop Audio
+    }
+
+	slider gainEngineSlider
+	{
+		width = 250
+		orientation = HORIZONTAL
+		min = 0
+		max = 1
+		value = 0
+		text = Gain
+		valueTextVisible = false
+	}
+
+	slider pitchEngineSlider
+	{
+		width = 250
+		orientation = HORIZONTAL
+		min = 0.1
+		max = 5
+		value = 1
+		text = Pitch
+		valueTextVisible = false
+	}
+}

BIN
samples/browser/res/common/audio/engine_loop.ogg


+ 15 - 0
samples/browser/res/common/audio/sample.audio

@@ -0,0 +1,15 @@
+audio backgroundTrack
+{
+    path = res/common/audio/background_track.ogg
+    looped = true
+}
+
+audio braking
+{
+    path = res/common/audio/braking.wav
+}
+
+audio engine
+{
+    path = res/common/audio/engine_loop.ogg
+}

+ 2 - 0
samples/browser/sample-browser.pro

@@ -10,6 +10,7 @@ TARGET = sample-browser
 TEMPLATE = app
 
 SOURCES += src/Audio3DSample.cpp \
+    src/AudioSample.cpp \
     src/BillboardSample.cpp \
     src/FirstPersonCamera.cpp \
     src/FontSample.cpp \
@@ -36,6 +37,7 @@ SOURCES += src/Audio3DSample.cpp \
     src/WaterSample.cpp
 
 HEADERS += src/Audio3DSample.h \
+    src/AudioSample.h \
     src/BillboardSample.h \
     src/FirstPersonCamera.h \
     src/FontSample.h \

+ 10 - 1
samples/browser/sample-browser.vcxproj

@@ -177,6 +177,12 @@ copy ..\..\gameplay\res\logo_powered_white.png res</Command>
       <SubType>Designer</SubType>
     </None>
     <None Include="icon.png" />
+    <None Include="res\common\audio\background.form" />
+    <None Include="res\common\audio\background_track.ogg" />
+    <None Include="res\common\audio\braking.form" />
+    <None Include="res\common\audio\engine.form" />
+    <None Include="res\common\audio\engine_loop.ogg" />
+    <None Include="res\common\audio\sample.audio" />
     <None Include="res\common\box.gpb" />
     <None Include="res\common\box.material" />
     <None Include="res\common\camera.lua" />
@@ -263,6 +269,7 @@ copy ..\..\gameplay\res\logo_powered_white.png res</Command>
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="src\Audio3DSample.cpp" />
+    <ClCompile Include="src\AudioSample.cpp" />
     <ClCompile Include="src\BillboardSample.cpp" />
     <ClCompile Include="src\FontSample.cpp" />
     <ClCompile Include="src\FormsSample.cpp" />
@@ -290,6 +297,7 @@ copy ..\..\gameplay\res\logo_powered_white.png res</Command>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="src\Audio3DSample.h" />
+    <ClInclude Include="src\AudioSample.h" />
     <ClInclude Include="src\BillboardSample.h" />
     <ClInclude Include="src\FontSample.h" />
     <ClInclude Include="src\FormsSample.h" />
@@ -343,9 +351,10 @@ copy ..\..\gameplay\res\logo_powered_white.png res</Command>
     <Image Include="res\png\logo.png" />
   </ItemGroup>
   <ItemGroup>
+    <Media Include="res\common\audio\braking.wav" />
     <Media Include="res\common\footsteps.wav" />
   </ItemGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
   <ImportGroup Label="ExtensionTargets">
   </ImportGroup>
-</Project>
+</Project>

+ 30 - 0
samples/browser/sample-browser.vcxproj.filters

@@ -30,6 +30,9 @@
     <Filter Include="res\common\fonts">
       <UniqueIdentifier>{10e17594-e3ef-49d2-a2a4-fb874c32b5c7}</UniqueIdentifier>
     </Filter>
+    <Filter Include="res\common\audio">
+      <UniqueIdentifier>{7da0c58a-d770-4181-8781-f9948df5bdd3}</UniqueIdentifier>
+    </Filter>
   </ItemGroup>
   <ItemGroup>
     <None Include="game.config" />
@@ -262,6 +265,24 @@
     <None Include="res\common\water\watersample.material" />
     <None Include="res\common\water\watersample.scene" />
     <None Include="res\common\water\watersample.vert" />
+    <None Include="res\common\audio\background.form">
+      <Filter>res\common\audio</Filter>
+    </None>
+    <None Include="res\common\audio\background_track.ogg">
+      <Filter>res\common\audio</Filter>
+    </None>
+    <None Include="res\common\audio\braking.form">
+      <Filter>res\common\audio</Filter>
+    </None>
+    <None Include="res\common\audio\engine.form">
+      <Filter>res\common\audio</Filter>
+    </None>
+    <None Include="res\common\audio\engine_loop.ogg">
+      <Filter>res\common\audio</Filter>
+    </None>
+    <None Include="res\common\audio\sample.audio">
+      <Filter>res\common\audio</Filter>
+    </None>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="src\MeshPrimitiveSample.h">
@@ -333,6 +354,9 @@
     <ClInclude Include="src\SceneLoadSample.h">
       <Filter>src</Filter>
     </ClInclude>
+    <ClInclude Include="src\AudioSample.h">
+      <Filter>src</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="src\MeshPrimitiveSample.cpp">
@@ -404,6 +428,9 @@
     <ClCompile Include="src\SceneLoadSample.cpp">
       <Filter>src</Filter>
     </ClCompile>
+    <ClCompile Include="src\AudioSample.cpp">
+      <Filter>src</Filter>
+    </ClCompile>
   </ItemGroup>
   <ItemGroup>
     <Image Include="res\common\terrain\dirt.dds">
@@ -474,5 +501,8 @@
     <Media Include="res\common\footsteps.wav">
       <Filter>res\common</Filter>
     </Media>
+    <Media Include="res\common\audio\braking.wav">
+      <Filter>res\common\audio</Filter>
+    </Media>
   </ItemGroup>
 </Project>

+ 8 - 0
samples/browser/sample-browser.xcodeproj/project.pbxproj

@@ -70,6 +70,8 @@
 		435FC4091A53449B003D4E9C /* libgameplay-deps.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 435FC4081A53449B003D4E9C /* libgameplay-deps.a */; };
 		435FC40D1A534AB4003D4E9C /* libgameplay.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 435FC40C1A534AB4003D4E9C /* libgameplay.a */; };
 		435FC40F1A538315003D4E9C /* libgameplay-deps.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 435FC40E1A538315003D4E9C /* libgameplay-deps.a */; };
+		437D9C731A66225400F65BDD /* AudioSample.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 437D9C711A66225400F65BDD /* AudioSample.cpp */; };
+		437D9C741A66225400F65BDD /* AudioSample.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 437D9C711A66225400F65BDD /* AudioSample.cpp */; };
 		5B61611614CCC24C0073B857 /* SamplesGame.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 42C932EF1491A5160098216A /* SamplesGame.cpp */; };
 		5B61612614CCC24C0073B857 /* icon.png in Resources */ = {isa = PBXBuildFile; fileRef = 42C932ED1491A4CB0098216A /* icon.png */; };
 		5B61612714CCC24C0073B857 /* res in Resources */ = {isa = PBXBuildFile; fileRef = 42C932F21491A53E0098216A /* res */; };
@@ -149,6 +151,8 @@
 		435FC4081A53449B003D4E9C /* libgameplay-deps.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = "libgameplay-deps.a"; path = "../../external-deps/libs/MacOS/x86_64/libgameplay-deps.a"; sourceTree = "<group>"; };
 		435FC40C1A534AB4003D4E9C /* libgameplay.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libgameplay.a; path = ../../gameplay/Build/Products/Debug/libgameplay.a; sourceTree = "<group>"; };
 		435FC40E1A538315003D4E9C /* libgameplay-deps.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = "libgameplay-deps.a"; path = "../../external-deps/libs/iOS/x86/libgameplay-deps.a"; sourceTree = "<group>"; };
+		437D9C711A66225400F65BDD /* AudioSample.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = AudioSample.cpp; sourceTree = "<group>"; };
+		437D9C721A66225400F65BDD /* AudioSample.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AudioSample.h; sourceTree = "<group>"; };
 		5B61611214CCC2200073B857 /* sample-browser-macosx.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "sample-browser-macosx.plist"; sourceTree = "<group>"; };
 		5B61612C14CCC24C0073B857 /* sample-browser-ios.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "sample-browser-ios.app"; sourceTree = BUILT_PRODUCTS_DIR; };
 		5B61612E14CCC24D0073B857 /* sample-browser-ios.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "sample-browser-ios.plist"; sourceTree = "<group>"; };
@@ -250,6 +254,8 @@
 				420D547715FE433900AD0B91 /* common */,
 				420D543A15FE430D00AD0B91 /* Audio3DSample.cpp */,
 				420D543B15FE430D00AD0B91 /* Audio3DSample.h */,
+				437D9C711A66225400F65BDD /* AudioSample.cpp */,
+				437D9C721A66225400F65BDD /* AudioSample.h */,
 				F10DEAB516726157006FFFDC /* BillboardSample.cpp */,
 				F10DEAB616726157006FFFDC /* BillboardSample.h */,
 				9F4C6CFE162735020076E137 /* GestureSample.cpp */,
@@ -462,6 +468,7 @@
 				420D546C15FE430D00AD0B91 /* SpriteBatchSample.cpp in Sources */,
 				420D546E15FE430D00AD0B91 /* Sample.cpp in Sources */,
 				420D547015FE430D00AD0B91 /* FontSample.cpp in Sources */,
+				437D9C731A66225400F65BDD /* AudioSample.cpp in Sources */,
 				42A1BA201A27BCE200BF506D /* ParticlesSample.cpp in Sources */,
 				420D547215FE430D00AD0B91 /* TextureSample.cpp in Sources */,
 				420D547415FE430D00AD0B91 /* TriangleSample.cpp in Sources */,
@@ -494,6 +501,7 @@
 				420D546D15FE430D00AD0B91 /* SpriteBatchSample.cpp in Sources */,
 				420D546F15FE430D00AD0B91 /* Sample.cpp in Sources */,
 				420D547115FE430D00AD0B91 /* FontSample.cpp in Sources */,
+				437D9C741A66225400F65BDD /* AudioSample.cpp in Sources */,
 				42A1BA211A27BCE200BF506D /* ParticlesSample.cpp in Sources */,
 				420D547315FE430D00AD0B91 /* TextureSample.cpp in Sources */,
 				420D547515FE430D00AD0B91 /* TriangleSample.cpp in Sources */,

+ 176 - 0
samples/browser/src/AudioSample.cpp

@@ -0,0 +1,176 @@
+#include "AudioSample.h"
+
+#if defined(ADD_SAMPLE)
+    ADD_SAMPLE("Media", "Audio Player", AudioSample, 2);
+#endif
+
+AudioSample::AudioSample()
+    :  _formBackground(NULL), _formBraking(NULL),  _formEngine(NULL), _audioBackgroundSource(NULL), _audioBrakingSource(NULL), _audioEngineSource(NULL)
+{
+}
+
+void AudioSample::initialize()
+{
+    _formBackground = Form::create("res/common/audio/background.form");
+
+    const char * buttons[] = { "playButton", "pauseButton", "resumeButton", "rewindButton", "stopButton" };
+    for (int i = 0; i < sizeof(buttons) / sizeof(uintptr_t); i++) {
+        Button* button = static_cast<Button*>(_formBackground->getControl(buttons[i]));
+        button->addListener(this, Control::Listener::RELEASE);
+    }   
+
+    // Create the audio source here, and feed the values into the UI controls.
+    _audioBackgroundSource = AudioSource::create("res/common/audio/sample.audio#backgroundTrack");
+    _audioBackgroundSource->play();
+
+    CheckBox* checkBox = static_cast<CheckBox*>(_formBackground->getControl("loopCheckBox"));
+    checkBox->setChecked(_audioBackgroundSource->isLooped());
+    checkBox->addListener(this, Control::Listener::VALUE_CHANGED);
+
+    Slider* slider = static_cast<Slider*>(_formBackground->getControl("gainSlider"));
+    slider->setValue(_audioBackgroundSource->getGain());
+    slider->addListener(this, Control::Listener::VALUE_CHANGED);
+
+    slider = static_cast<Slider*>(_formBackground->getControl("pitchSlider"));
+    slider->setValue(_audioBackgroundSource->getPitch());
+    slider->addListener(this, Control::Listener::VALUE_CHANGED);
+
+    _formBraking = Form::create("res/common/audio/braking.form");
+
+    Button* button = static_cast<Button*>(_formBraking->getControl("playBrakingButton"));
+    button->addListener(this, Control::Listener::RELEASE);
+
+    button = static_cast<Button*>(_formBraking->getControl("stopBrakingButton"));
+    button->addListener(this, Control::Listener::RELEASE);
+
+    _audioBrakingSource = AudioSource::create("res/common/audio/sample.audio#braking");
+
+    checkBox = static_cast<CheckBox*>(_formBraking->getControl("loopBrakingCheckBox"));
+    checkBox->setChecked(_audioBrakingSource->isLooped());
+    checkBox->addListener(this, Control::Listener::VALUE_CHANGED);
+
+    slider = static_cast<Slider*>(_formBraking->getControl("gainBrakingSlider"));
+    slider->setValue(_audioBrakingSource->getGain());
+    slider->addListener(this, Control::Listener::VALUE_CHANGED);
+
+    slider = static_cast<Slider*>(_formBraking->getControl("pitchBrakingSlider"));
+    slider->setValue(_audioBrakingSource->getPitch());
+    slider->addListener(this, Control::Listener::VALUE_CHANGED);
+
+    _formEngine = Form::create("res/common/audio/engine.form");
+
+    button = static_cast<Button*>(_formEngine->getControl("playEngineButton"));
+    button->addListener(this, Control::Listener::RELEASE);
+
+    button = static_cast<Button*>(_formEngine->getControl("stopEngineButton"));
+    button->addListener(this, Control::Listener::RELEASE);
+
+    _audioEngineSource = AudioSource::create("res/common/audio/sample.audio#engine");
+
+    checkBox = static_cast<CheckBox*>(_formEngine->getControl("loopEngineCheckBox"));
+    checkBox->setChecked(_audioEngineSource->isLooped());
+    checkBox->addListener(this, Control::Listener::VALUE_CHANGED);
+
+    slider = static_cast<Slider*>(_formEngine->getControl("gainEngineSlider"));
+    slider->setValue(_audioEngineSource->getGain());
+    slider->addListener(this, Control::Listener::VALUE_CHANGED);
+
+    slider = static_cast<Slider*>(_formEngine->getControl("pitchEngineSlider"));
+    slider->setValue(_audioEngineSource->getPitch());
+    slider->addListener(this, Control::Listener::VALUE_CHANGED);
+}
+
+void AudioSample::finalize()
+{
+    SAFE_RELEASE(_audioEngineSource);
+    SAFE_RELEASE(_formEngine);
+    SAFE_RELEASE(_audioBackgroundSource);
+    SAFE_RELEASE(_formBraking);
+    SAFE_RELEASE(_audioBackgroundSource);
+    SAFE_RELEASE(_formBackground);
+}
+
+void AudioSample::update(float elapsedTime)
+{
+    _formBackground->update(elapsedTime);
+    _formBraking->update(elapsedTime);
+    _formEngine->update(elapsedTime);
+}
+
+void AudioSample::render(float elapsedTime)
+{
+    // Clear the color and depth buffers
+    clear(CLEAR_COLOR_DEPTH, Vector4::zero(), 1.0f, 0);
+
+    // Visit all the nodes in the scene for drawing
+    _formBackground->draw();
+    _formBraking->draw();
+    _formEngine->draw();
+}
+
+void AudioSample::controlEvent(Control* control, EventType eventType)
+{
+    switch (eventType)
+    {
+    case Control::Listener::RELEASE:
+        if (strcmp("playButton", control->getId()) == 0) {
+            _audioBackgroundSource->play();
+        } else if (strcmp("pauseButton", control->getId()) == 0) {
+            _audioBackgroundSource->pause();
+        } else if (strcmp("resumeButton", control->getId()) == 0) {
+            _audioBackgroundSource->resume();
+        } else if (strcmp("rewindButton", control->getId()) == 0) {
+            _audioBackgroundSource->rewind();
+        } else if (strcmp("stopButton", control->getId()) == 0) {
+            _audioBackgroundSource->stop();
+        } else if (strcmp("playBrakingButton", control->getId()) == 0) {
+            _audioBrakingSource->play();
+        } else if (strcmp("stopBrakingButton", control->getId()) == 0) {
+            _audioBrakingSource->stop();
+        } else if (strcmp("playEngineButton", control->getId()) == 0) {
+            _audioEngineSource->play();
+        } else if (strcmp("stopEngineButton", control->getId()) == 0) {
+            _audioEngineSource->stop();
+        }
+        break;
+    case Control::Listener::VALUE_CHANGED:
+        if (strcmp("loopCheckBox", control->getId()) == 0) {
+            CheckBox* loopCheckBox = static_cast<CheckBox*>(control);
+            _audioBackgroundSource->setLooped(loopCheckBox->isChecked());
+        } else if (strcmp("gainSlider", control->getId()) == 0) {
+            Slider* gainSlider = static_cast<Slider*>(control);
+            _audioBackgroundSource->setGain(float(gainSlider->getValue()));
+        } else if (strcmp("pitchSlider", control->getId()) == 0) {
+            Slider* pitchSlider = static_cast<Slider*>(control);
+            float pitchValue = (float)pitchSlider->getValue();
+            if (pitchValue != 0.0f) {
+                _audioBackgroundSource->setPitch(pitchValue);
+            }
+        } else if (strcmp("loopBrakingCheckBox", control->getId()) == 0) {
+            CheckBox* loopCheckBox = static_cast<CheckBox*>(control);
+            _audioBrakingSource->setLooped(loopCheckBox->isChecked());
+        } else if (strcmp("gainBrakingSlider", control->getId()) == 0) {
+            Slider* gainSlider = static_cast<Slider*>(control);
+            _audioBrakingSource->setGain(float(gainSlider->getValue()));
+        } else if (strcmp("pitchBrakingSlider", control->getId()) == 0) {
+            Slider* pitchSlider = static_cast<Slider*>(control);
+            float pitchValue = (float)pitchSlider->getValue();
+            if (pitchValue != 0.0f) {
+                _audioBrakingSource->setPitch(pitchValue);
+            }
+        } else if (strcmp("loopEngineCheckBox", control->getId()) == 0) {
+            CheckBox* loopCheckBox = static_cast<CheckBox*>(control);
+            _audioEngineSource->setLooped(loopCheckBox->isChecked());
+        } else if (strcmp("gainEngineSlider", control->getId()) == 0) {
+            Slider* gainSlider = static_cast<Slider*>(control);
+            _audioEngineSource->setGain(float(gainSlider->getValue()));
+        } else if (strcmp("pitchEngineSlider", control->getId()) == 0) {
+            Slider* pitchSlider = static_cast<Slider*>(control);
+            float pitchValue = (float)pitchSlider->getValue();
+            if (pitchValue != 0.0f) {
+                _audioEngineSource->setPitch(pitchValue);
+            }
+        }
+        break;
+    }
+}

+ 36 - 0
samples/browser/src/AudioSample.h

@@ -0,0 +1,36 @@
+#ifndef FORMSSAMPLE_H_
+#define FORMSSAMPLE_H_
+
+#include "SamplesGame.h"
+
+using namespace gameplay;
+
+class AudioSample : public Sample, Control::Listener
+{
+public:
+    
+    AudioSample();
+
+protected:
+
+    void initialize();
+
+    void finalize();
+
+    void update(float elapsedTime);
+
+    void render(float elapsedTime);
+
+    void controlEvent(Control* control, EventType evt);
+
+private:
+    
+    Form* _formBackground;
+    Form* _formBraking;
+    Form* _formEngine;
+    AudioSource* _audioBackgroundSource;
+    AudioSource* _audioBrakingSource;
+    AudioSource* _audioEngineSource;
+};
+
+#endif