1/**App window for the FileSoundWindow test
2	@author Tim de Jong
3	@date 21/09/2002
4	@version 1.0
5 */
6
7
8#include "FileSoundWindow.h"
9
10#include <Alert.h>
11#include <Application.h>
12#include <Box.h>
13#include <Button.h>
14#include <CheckBox.h>
15#include <Entry.h>
16#include <Path.h>
17#include <TextControl.h>
18
19#include <stdio.h>
20#include <stdlib.h>
21
22
23FileSoundWindow::FileSoundWindow(BRect windowBounds)
24					:BWindow(windowBounds,"BFileGameSound test",B_TITLED_WINDOW,B_NOT_ZOOMABLE|B_NOT_RESIZABLE)
25{
26	//init private vars
27	loop = false;
28	preload = false;
29	playing = false;
30	paused = false;
31	rampTime = 250000; // 250 ms default
32	fileSound = 0;
33	//make openPanel and let it send its messages to this window
34	openPanel = new BFilePanel();
35	openPanel -> SetTarget(this);
36	//get appBounds
37	BRect appBounds = Bounds();
38	//make a cosmetic box
39	BBox *box = new BBox(appBounds);
40	//textcontrol to display the chosen file
41	BRect textBounds(appBounds.left + 10, appBounds.top + 10, appBounds.right - 70, appBounds.top + 20);
42	textControl = new BTextControl(textBounds,"filechosen","Play file:","No file chosen yet.", NULL);
43	textControl -> SetEnabled(false);
44
45	float x1 = textControl -> Bounds().left;
46	float x2 = textControl -> Bounds().right;
47	float dividerX = 0.20 * (x2 - x1);
48	textControl -> SetDivider(dividerX);
49
50	box -> AddChild(textControl);
51	//button to choose file
52	BRect browseBounds(textBounds.right + 5,textBounds.top, appBounds.right - 5, textBounds.bottom);
53	BMessage *browseMessage = new BMessage(BROWSE_MSG);
54	BButton *browseButton = new BButton(browseBounds,"browseButton","Browse" B_UTF8_ELLIPSIS,browseMessage);
55	box -> AddChild(browseButton);
56	//make play button
57	BRect playBounds(textBounds.left,textBounds.bottom + 15, textBounds.left + 50, textBounds.bottom + 25);
58	BMessage *playMessage = new BMessage(PLAY_MSG);
59	playButton = new BButton(playBounds,"playbutton","Play", playMessage);
60	box -> AddChild(playButton);
61	//make pause button
62	BRect pauseBounds(playBounds.right + 10,playBounds.top, playBounds.right + 60, playBounds.bottom);
63	BMessage *pauseMessage = new BMessage(PAUSE_MSG);
64	pauseButton = new BButton(pauseBounds,"pausebutton","Pause",pauseMessage);
65	box -> AddChild(pauseButton);
66	//make textcontrol to enter delay for pausing/resuming
67	BRect delayBounds(pauseBounds.right + 10, pauseBounds.top,pauseBounds.right + 150, pauseBounds.bottom);
68	delayControl = new BTextControl(delayBounds,"delay","Ramp time (ms)","250", new BMessage(DELAY_MSG));
69	delayControl -> SetDivider(90);
70	delayControl -> SetModificationMessage(new BMessage(DELAY_MSG));
71	box -> AddChild(delayControl);
72	//make loop checkbox
73	BRect loopBounds(playBounds.left,playBounds.bottom + 20, playBounds.left + 150, playBounds.bottom + 30);
74	BMessage *loopMessage = new BMessage(LOOP_MSG);
75	loopCheck = new BCheckBox(loopBounds,"loopcheckbox","Loop the sound file",loopMessage);
76	box -> AddChild(loopCheck);
77	//make preload checkbox
78	BRect preloadBounds(loopBounds.right + 10,loopBounds.top, loopBounds.right + 150, loopBounds.bottom);
79	BMessage *preloadMessage = new BMessage(PRELOAD_MSG);
80	preloadCheck = new BCheckBox(preloadBounds,"loopcheckbox","Preload the sound file",preloadMessage);
81	box -> AddChild(preloadCheck);
82	//add background box to window
83	AddChild(box);
84}
85
86FileSoundWindow::~FileSoundWindow()
87{
88}
89
90void FileSoundWindow::MessageReceived(BMessage *message)
91{
92	switch (message -> what)
93	{
94		case BROWSE_MSG:
95			openPanel -> Show();
96		break;
97
98		case B_REFS_RECEIVED:
99		{
100			message->FindRef("refs", 0, &fileref);
101			BPath path(new BEntry(&fileref));
102			textControl -> SetText(path.Path());
103		}
104		break;
105
106		case PLAY_MSG:
107		{
108			if (!playing)
109			{
110				fileSound = new BFileGameSound(&fileref,loop);
111				status_t error = fileSound -> InitCheck();
112				if (error != B_OK)
113				{
114					delete fileSound;
115					fileSound = 0;
116					if (error == B_NO_MEMORY)
117					{
118						BAlert *alert = new BAlert("alert","Not enough memory.","OK");
119						alert -> Go();
120					}
121					else if (error == B_ERROR)
122					{
123						BAlert *alert = new BAlert("alert","Unable to create a sound player.","OK");
124						alert -> Go();
125					}
126					else
127					{
128						BAlert *alert = new BAlert("alert","Other kind of error!","OK");
129						alert -> Go();
130					}
131					break;
132				}
133				paused = false;
134				pauseButton -> SetLabel("Pause");
135				//preload sound file?
136				if (preload)
137				{
138					status_t preloadError = fileSound -> Preload();
139					if (preloadError != B_OK)
140					{
141						BAlert *alert = new BAlert("alert","Port errors. Unable to communicate with the streaming sound port.","OK");
142						alert -> Go();
143					}
144				}
145				//play it!
146				status_t playerror = fileSound -> StartPlaying();
147				if (playerror != B_OK)
148				{
149					if (playerror == EALREADY)
150					{
151						BAlert *alert = new BAlert("alert","Sound is already playing","OK");
152						alert -> Go();
153					}
154					else
155					{
156						BAlert *alert = new BAlert("alert","Error playing sound","OK");
157						alert -> Go();
158					}
159				}
160				else
161				{
162					playButton -> SetLabel("Stop");
163					playing = true;
164				}
165			}
166			else
167			{
168				//stop it!
169				status_t stoperror = fileSound -> StopPlaying();
170				if (stoperror != B_OK)
171				{
172					if (stoperror == EALREADY)
173					{
174						BAlert *alert = new BAlert("alert","Sound is already stopped","OK");
175						alert -> Go();
176					}
177					else
178					{
179						BAlert *alert = new BAlert("alert","Error stopping sound","OK");
180						alert -> Go();
181					}
182				}
183				else
184				{
185					playButton -> SetLabel("Play");
186					playing = false;
187				}
188				delete fileSound;
189				fileSound = 0;
190			}
191		}
192		break;
193
194		case PAUSE_MSG:
195		{
196			if (!fileSound)
197				break;
198
199			int32 pausedValue = fileSound -> IsPaused();
200			if (pausedValue != BFileGameSound::B_PAUSE_IN_PROGRESS)
201			{
202				status_t error;
203				const char *label;
204				if (paused)
205				{
206					paused = false;
207					label = "Pause";
208					error = fileSound ->SetPaused(paused, rampTime);
209				}
210				else
211				{
212					paused = true;
213					label = "Resume";
214					error = fileSound ->SetPaused(paused, rampTime);
215				}
216
217				if (error != B_OK)
218				{
219					if (error == EALREADY)
220					{
221						BAlert *alert = new BAlert("alert","Already in requested state","OK");
222						alert -> Go();
223					}
224					else
225					{
226						BAlert *alert = new BAlert("alert","Error!","OK");
227						alert -> Go();
228					}
229				}
230				else
231				{
232					pauseButton -> SetLabel(label);
233				}
234			}
235		}
236		break;
237
238		case LOOP_MSG:
239		{
240			int32 checkValue = loopCheck -> Value();
241			if (checkValue == B_CONTROL_ON)
242				loop = true;
243			else loop = false;
244		}
245		break;
246
247		case PRELOAD_MSG:
248		{
249			int32 checkValue = preloadCheck -> Value();
250			if (checkValue == B_CONTROL_ON)
251				preload = true;
252			else preload = false;
253		}
254		break;
255
256		case DELAY_MSG:
257		{
258			//set delay time for resuming/pausing
259			rampTime = atol(delayControl -> Text()) * 1000;
260		}
261		break;
262	}
263
264}
265
266bool FileSoundWindow::QuitRequested()
267{
268
269	delete openPanel;
270	if (fileSound != 0 && fileSound -> IsPlaying())
271		fileSound -> StopPlaying();
272	delete fileSound;
273	be_app->PostMessage(B_QUIT_REQUESTED);
274	return(true);
275}
276