1/* ================
2
3   FILE:  AudioModule.h
4   REVS:  $Revision: 1.1 $
5   NAME:  marc
6
7   Copyright (c) 1997 by Be Incorporated.  All Rights Reserved.
8
9================ */
10
11#ifndef _AUDIO_MODULE_H
12#define _AUDIO_MODULE_H
13
14#include <File.h>
15
16#include "OldMediaModule.h"
17#include "OldMediaDefs.h"
18
19class BADCStream;
20class BDACStream;
21class BSubscriber;
22
23class BAudioEvent : public BMediaEvent {
24public:
25  BAudioEvent(int32 frames, bool stereo, float* samples = NULL);
26  ~BAudioEvent();
27
28  virtual mk_time		Start();
29  virtual void			SetStart(mk_time);
30  virtual mk_time		Duration();
31  virtual int32			Frames();
32  virtual float*		Samples();
33  virtual int32			ChannelCount();
34  virtual float			Gain();
35  virtual void			SetGain(float);
36  virtual int32			Destination();
37  virtual void			SetDestination(int32);
38  virtual bool			MixIn (float* dst, int32 frames, mk_time time);
39  virtual BMediaEvent*	Clone();
40  virtual bigtime_t		CaptureTime();
41  virtual void			SetCaptureTime(bigtime_t);
42
43private:
44  mk_time	fStart;
45  int32		fFrames;
46  float*	fSamples;
47  float		fGain;
48  int32		fDestination;
49  bigtime_t	fCaptureTime;
50  bool		fStereo;
51  bool		fFreeHuey;
52};
53
54
55class BDACRenderer : public BMediaRenderer {
56public:
57  BDACRenderer(const char* name = NULL);
58  ~BDACRenderer();
59
60  mk_rate		Units();
61  mk_time		Latency();
62  mk_time		Start();
63  mk_time		Duration();
64  BTimeBase*	TimeBase();
65  void			Open();
66  void			Close();
67  void			Wakeup();
68  void			TransportChanged(mk_time time, mk_rate rate,
69								 transport_status status);
70  void			StreamChanged();
71
72  virtual BMediaChannel*	Channel();
73
74private:
75  static bool	_WriteDAC(void* arg, char* buf, uint32 bytes, void* header);
76  bool			WriteDAC(short* buf, int32 frames, audio_buffer_header* header);
77  bool			MixActiveSegments(mk_time start);
78  void			MixOutput(short* dst);
79
80  BMediaChannel*	fChannel;
81  BDACStream*		fDACStream;
82  BSubscriber*		fSubscriber;
83  float*			fBuffer;
84  int32				fBufferFrames;
85  BList				fActiveSegments;
86  mk_time			fLatency;
87  mk_time			fNextTime;
88  bool				fRunning;
89  BTimeBase			fDACTimeBase;
90};
91
92
93class BAudioFileStream : public BEventStream {
94public:
95  BAudioFileStream(BMediaChannel* channel, BFile* file,
96				   mk_time start = B_UNDEFINED_MK_TIME);
97  ~BAudioFileStream();
98
99  BMediaEvent*				GetEvent(BMediaChannel* channel);
100  BMediaEvent*				PeekEvent(BMediaChannel* channel, mk_time asap = 0);
101  status_t					SeekToTime(BMediaChannel* channel, mk_time time);
102  void						SetStart(mk_time start);
103
104  virtual bigtime_t 		CaptureTime();
105  virtual BMediaChannel*	Channel();
106
107private:
108  BMediaChannel*	fChannel;
109  BFile*			fFile;
110  mk_time			fTime;
111  BAudioEvent*		fCurrentEvent;
112  short*			fBuffer;
113};
114
115
116class BADCSource : public BEventStream {
117public:
118  BADCSource(BMediaChannel* channel, mk_time start = 0);
119  ~BADCSource();
120
121  BMediaEvent*				GetEvent(BMediaChannel* channel);
122  BMediaEvent*				PeekEvent(BMediaChannel* channel, mk_time asap = 0);
123  status_t					SeekToTime(BMediaChannel* channel, mk_time time);
124  void						SetStart(mk_time start);
125
126  virtual BMediaChannel*	Channel();
127
128private:
129  static bool	_ReadADC(void* arg, char* buf, uint32 bytes, void* header);
130  void			ReadADC(short* buf, int32 frames, audio_buffer_header* header);
131
132  BMediaChannel*	fChannel;
133  BFile*			fFile;
134  mk_time			fTime;
135  BAudioEvent*		fCurrentEvent;
136  BAudioEvent*		fNextEvent;
137  BLocker			fEventLock;
138  BADCStream*		fADCStream;
139  BSubscriber*		fSubscriber;
140};
141
142
143#endif
144