1//------------------------------------------------------------------------------
2// SimpleSoundTest.cpp
3//
4// Unit test for the game kit.
5//
6// Copyright (c) 2001 Haiku Project
7//
8// Permission is hereby granted, free of charge, to any person obtaining a
9// copy of this software and associated documentation files (the "Software"),
10// to deal in the Software without restriction, including without limitation
11// the rights to use, copy, modify, merge, publish, distribute, sublicense,
12// and/or sell copies of the Software, and to permit persons to whom the
13// Software is furnished to do so, subject to the following conditions:
14//
15// The above copyright notice and this permission notice shall be included
16// in all copies or substantial portions of the Software.
17//
18// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
21// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
23// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
24// DEALINGS IN THE SOFTWARE.
25//
26//	File Name:		SimpleSoundTest.h
27//	Author:			Christopher ML Zumwalt May (zummy@users.sf.net)
28//	Description:	BSimpleGameSound test application
29//------------------------------------------------------------------------------
30
31#include <stdlib.h>
32
33#include <Button.h>
34#include <Slider.h>
35#include <CheckBox.h>
36#include <FilePanel.h>
37#include <TextControl.h>
38
39#include "SimpleGameSound.h"
40#include "SimpleSoundTest.h"
41
42const int32 SLIDER_PAN = 'SPan';
43const int32 SLIDER_GAIN = 'Gain';
44const int32 BUTTON_START = 'Strt';
45const int32 BUTTON_STOP = 'Stop';
46const int32 BUTTON_BROWSE = 'Open';
47const int32 CHECK_LOOP = 'Loop';
48
49int main(int, char**)
50{
51	SimpleSoundApp app("application/x-vnd.OBOS.GameKitApp");
52	app.Run();
53	return 0;
54}
55
56
57// SimpleSoundApp ---------------------------------------------------------
58SimpleSoundApp::SimpleSoundApp(const char *signature)
59	: BApplication(signature)
60{
61}
62
63
64void SimpleSoundApp::ReadyToRun()
65{
66	fWin = new SimpleSoundWin(BRect(100, 200, 330, 450), "GameKit Unit Test");
67	fWin->Show();
68}
69
70
71void SimpleSoundApp::RefsReceived(BMessage* msg)
72{
73	uint32 type;
74	int32 count;
75	msg->GetInfo("refs", &type, &count);
76	if (type == B_REF_TYPE)
77	{
78		// Load the files
79		for(int32 i = 0; i < count; i++)
80		{
81			entry_ref file;
82			if (msg->FindRef("refs", i, &file) == B_OK)
83			{
84				BSimpleGameSound * sound = new BSimpleGameSound(&file);
85
86				if (sound->InitCheck() == B_OK)
87					fWin->SetSound(sound);
88				else
89					delete sound;
90			}
91		}
92	}
93}
94
95
96// SimpleSoundWin ---------------------------------------------------------------
97SimpleSoundWin::SimpleSoundWin(BRect frame, const char * title)
98	:	BWindow(frame, title, B_TITLED_WINDOW, B_NOT_RESIZABLE | B_ASYNCHRONOUS_CONTROLS),
99		fSound(NULL),
100		fPanel(NULL)
101{
102	BRect r(10, 10, 100, 40);
103	fBrowse = new BButton(r, "buttonBrowse", "Browse", new BMessage(BUTTON_BROWSE));
104	fBrowse->SetEnabled(true);
105	AddChild(fBrowse);
106
107	// Add the button which start and stop playback of the choosen sound
108	r.OffsetBy(0, 50);
109	fStart = new BButton(r, "buttonStart", "Start", new BMessage(BUTTON_START));
110	fStart->SetEnabled(false);
111	AddChild(fStart);
112
113	r.OffsetBy(110, 0);
114	fStop = new BButton(r, "buttonStop", "Stop", new BMessage(BUTTON_STOP));
115	fStop->SetEnabled(false);
116	AddChild(fStop);
117
118	// Control the sound's volumn (gain)
119	r.Set(10, 100, 200, 40);
120	fGain = new BSlider(r, "sliderGain", "Gain", new BMessage(SLIDER_GAIN), 0, 100);
121	fGain->SetHashMarks(B_HASH_MARKS_BOTTOM);
122	fGain->SetHashMarkCount(10);
123	fGain->SetLimitLabels("Mute", "Full");
124	fGain->SetPosition(1.0);
125	fGain->SetEnabled(false);
126	AddChild(fGain);
127
128	// Control the sound's pan
129	r.OffsetBy(0, 60);
130	fPan = new BSlider(r, "sliderPan", "Pan", new BMessage(SLIDER_PAN), -100, 100);
131	fPan->SetHashMarks(B_HASH_MARKS_BOTTOM);
132	fPan->SetHashMarkCount(10);
133	fPan->SetLimitLabels("Left", "Right");
134	fPan->SetEnabled(false);
135	AddChild(fPan);
136
137	r.Set(10, 220, 110, 40);
138	fRamp = new BTextControl(r, "txtRamp", "Ramp", "20", NULL);
139	fRamp->SetDivider(30);
140	fRamp->SetEnabled(true);
141	AddChild(fRamp);
142
143	r.Set(120, 220, 200, 40);
144	fLoop = new BCheckBox(r, "chkLoop", "Loop", new BMessage(CHECK_LOOP));
145	fLoop->SetEnabled(false);
146	AddChild(fLoop);
147}
148
149
150SimpleSoundWin::~SimpleSoundWin()
151{
152	delete fPanel;
153	delete fSound;
154}
155
156
157void SimpleSoundWin::Quit()
158{
159	be_app->PostMessage(B_QUIT_REQUESTED);
160	BWindow::Quit();
161}
162
163
164void SimpleSoundWin::MessageReceived(BMessage *msg)
165{
166	int32 pos;
167	bigtime_t ramp = bigtime_t(atoi(fRamp->Text()) * 100000.0);
168
169	switch (msg->what)
170	{
171	case BUTTON_START:
172		fStop->SetEnabled(true);
173		fGain->SetEnabled(true);
174		fPan->SetEnabled(true);
175		fLoop->SetEnabled(true);
176
177		fSound->StartPlaying();
178		break;
179
180	case BUTTON_STOP:
181		fStop->SetEnabled(false);
182		fGain->SetEnabled(false);
183		fPan->SetEnabled(false);
184		fLoop->SetEnabled(false);
185
186		fSound->StopPlaying();
187		break;
188
189	case SLIDER_GAIN:
190		fSound->SetGain(fGain->Position(), ramp);
191		break;
192
193	case SLIDER_PAN:
194		pos = fPan->Value();
195		fSound->SetPan(pos / 100.0, ramp);
196		break;
197
198	case BUTTON_BROWSE:
199		if (!fPanel) fPanel = new BFilePanel(B_OPEN_PANEL, &be_app_messenger);
200
201		fPanel->Show();
202		break;
203
204	case CHECK_LOOP:
205		fSound->SetIsLooping(fLoop->Value() == B_CONTROL_ON);
206		break;
207
208	default:
209		BWindow::MessageReceived(msg);
210		break;
211	}
212}
213
214
215void SimpleSoundWin::SetSound(BSimpleGameSound * sound)
216{
217	delete fSound;
218
219	// enable the Start button if we were given a valid sound
220	Lock();
221
222	fStart->SetEnabled((sound != NULL));
223	fLoop->SetValue(B_CONTROL_OFF);
224	fGain->SetPosition(1.0);
225	fPan->SetPosition(0.0);
226
227	Unlock();
228
229	fSound = sound;
230}
231