1/*
2 * Copyright 2001-2002, Haiku.
3 * Distributed under the terms of the MIT License.
4 *
5 * Author:	Christopher ML Zumwalt May (zummy@users.sf.net)
6 */
7
8#ifndef _GAMESOUNDBUFFER_H
9#define _GAMESOUNDBUFFER_H
10
11
12#include <GameSoundDefs.h>
13#include <MediaDefs.h>
14#include <MediaNode.h>
15
16const int32 kPausedAttribute = B_GS_FIRST_PRIVATE_ATTRIBUTE;
17
18class GameProducer;
19struct _gs_ramp;
20struct Connection
21{
22	media_node producer, consumer;
23	media_source source;
24	media_destination destination;
25	media_format format;
26	media_node timeSource;
27};
28
29
30class GameSoundBuffer {
31public:
32
33									GameSoundBuffer(const gs_audio_format* format);
34	virtual							~GameSoundBuffer();
35
36	virtual status_t				Connect(media_node * consumer);
37			status_t				StartPlaying();
38			status_t				StopPlaying();
39			bool					IsPlaying();
40
41			void					Play(void * data, int64 frames);
42			void					UpdateMods();
43	virtual void					Reset();
44
45	virtual void * 					Data() { return NULL; }
46			const gs_audio_format &	Format() const;
47
48			bool					IsLooping() const;
49			void					SetLooping(bool loop);
50			float					Gain() const;
51			status_t				SetGain(float gain, bigtime_t duration);
52			float					Pan() const;
53			status_t				SetPan(float pan, bigtime_t duration);
54
55	virtual	status_t				GetAttributes(gs_attribute * attributes,
56												  size_t attributeCount);
57	virtual status_t				SetAttributes(gs_attribute * attributes,
58												  size_t attributeCount);
59protected:
60
61	virtual void					FillBuffer(void * data, int64 frames) = 0;
62
63			gs_audio_format			fFormat;
64			bool					fLooping;
65
66			size_t					fFrameSize;
67
68			Connection *			fConnection;
69			GameProducer *			fNode;
70
71private:
72
73			bool					fIsConnected;
74			bool					fIsPlaying;
75
76			float					fGain;
77			float					fPan, fPanLeft, fPanRight;
78			_gs_ramp*				fGainRamp;
79			_gs_ramp*				fPanRamp;
80};
81
82
83class SimpleSoundBuffer : public GameSoundBuffer {
84public:
85								SimpleSoundBuffer(const gs_audio_format* format,
86													const void * data,
87													int64 frames = 0);
88	virtual						~SimpleSoundBuffer();
89
90	virtual void *				Data() { return fBuffer; }
91	virtual void				Reset();
92
93protected:
94
95	virtual	void				FillBuffer(void * data, int64 frames);
96
97private:
98			char *				fBuffer;
99			size_t				fBufferSize;
100			size_t				fPosition;
101};
102
103
104class StreamingSoundBuffer : public GameSoundBuffer {
105public:
106								StreamingSoundBuffer(const gs_audio_format * format,
107													 const void * streamHook,
108													 size_t inBufferFrameCount,
109													 size_t inBufferCount);
110	virtual						~StreamingSoundBuffer();
111
112protected:
113
114	virtual void				FillBuffer(void * data, int64 frames);
115
116private:
117
118			void *				fStreamHook;
119};
120
121#endif
122
123