1 /* PROJECT:         ReactOS sndrec32
2  * LICENSE:         GPL - See COPYING in the top level directory
3  * FILE:            base/applications/sndrec32/audio_waveout.hpp
4  * PURPOSE:         Windows MM wave out abstraction
5  * PROGRAMMERS:     Marco Pagliaricci (irc: rendar)
6  */
7 
8 #ifndef _AUDIOWAVEOUT__H_
9 #define _AUDIOWAVEOUT__H_
10 
11 #include "audio_format.hpp"
12 #include "audio_producer.hpp"
13 
14 _AUDIO_NAMESPACE_START_
15 
16 enum audio_waveout_status
17 {
18     WAVEOUT_NOTREADY,
19     WAVEOUT_READY,
20     WAVEOUT_PLAYING,
21     WAVEOUT_FLUSHING,
22     WAVEOUT_PAUSED,
23     WAVEOUT_STOP,
24     WAVEOUT_ERR
25 };
26 
27 class audio_waveout
28 {
29     friend class audio_buffer;
30 
31     private:
32         static DWORD WINAPI playing_procedure(LPVOID);
33         HANDLE wakeup_playthread;
34 
35     protected:
36         WAVEFORMATEX wave_format;
37         WAVEHDR *wave_headers;
38         HWAVEOUT waveout_handle;
39 
40         const audio_format &aud_info;
41         audio_producer &audio_buf;
42 
43         /* Audio Playing Thread id */
44         DWORD playthread_id;
45 
46         audio_waveout_status status;
47         float buf_secs;
48 
49         /* The temporary buffers for the audio data outgoing to the waveout
50            device and its size, and its total number */
51 
52         /* base address for entire memory */
53         BYTE *main_buffer;
54 
55         /* size in bytes for the entire memory */
56         unsigned int mb_size;
57 
58         /* number of little buffers */
59         unsigned int buffers;
60 
61         /* Protected Functions */
62 
63         void init_(void);
64         void alloc_buffers_mem_(unsigned int, float);
65         void free_buffers_mem_(void);
66 
67         void init_headers_(void);
68         void prep_headers_(void);
69         void unprep_headers_(void);
70 
71     public:
72         /* Ctors */
audio_waveout(const audio_format & aud_fmt,audio_producer & a_buf)73         audio_waveout(const audio_format &aud_fmt,
74                       audio_producer &a_buf) : wave_headers(0),
75                                                aud_info(aud_fmt),
76                                                audio_buf(a_buf),
77                                                status(WAVEOUT_NOTREADY),
78                                                main_buffer(0),
79                                                mb_size(0),
80                                                buffers(_AUDIO_DEFAULT_WAVEOUTBUFFERS)
81         {
82             /* Initializing internal wavein data */
83             init_();
84         }
85 
86         /* Dtor */
~audio_waveout(void)87         ~audio_waveout(void)
88         {
89         }
90 
91         /* Public Functions */
92 
93         void open(void);
94         void play(void);
95         void pause(void);
96         void stop(void);
97         void close(void);
98 
current_status(void)99         audio_waveout_status current_status(void)
100         {
101             return status;
102         }
103 
buf(void)104         BYTE *buf(void)
105         {
106             return main_buffer;
107         }
108 
bufsz(void)109         unsigned int bufsz(void)
110         {
111             return mb_size;
112         }
113 
samplevalue_max(void)114         unsigned int samplevalue_max(void)
115         {
116             if (aud_info.bits() == 16)
117                 return (unsigned int)65535;
118             else if (aud_info.bits() == 8)
119                 return (unsigned int)255;
120             else
121                 return 0;
122         }
123 
tot_samples_buf(void)124         unsigned tot_samples_buf(void)
125         {
126             return aud_info.samples_in_bytes(mb_size);
127         }
128 
nsample(unsigned int nsamp)129         unsigned int nsample(unsigned int nsamp)
130         {
131             unsigned int svalue;
132 
133             if (aud_info.bits() == 16)
134                 svalue = (unsigned int)abs(*((short *)(main_buffer + aud_info.bytes_in_samples(nsamp))));
135             else if (aud_info.bits() == 8)
136                svalue = (unsigned int)((ptrdiff_t) *(main_buffer + aud_info.bytes_in_samples(nsamp)));
137             else
138                 svalue = 0;
139 
140             return svalue;
141         }
142 };
143 
144 _AUDIO_NAMESPACE_END_
145 
146 #endif /* _AUDIOWAVEOUT__H_ */
147