+/* PROJECT: ReactOS sndrec32
+ * LICENSE: GPL - See COPYING in the top level directory
+ * FILE: base/applications/sndrec32/audio_waveout.hpp
+ * PURPOSE: Windows MM wave out abstraction
+ * PROGRAMMERS: Marco Pagliaricci (irc: rendar)
+ */
+
+
+
+
#ifndef _AUDIOWAVEOUT__H_
#define _AUDIOWAVEOUT__H_
#include "audio_def.hpp"
#include "audio_format.hpp"
+
+
#include "audio_producer.hpp"
_AUDIO_NAMESPACE_START_
+
+
+
+
enum audio_waveout_status { WAVEOUT_NOTREADY, WAVEOUT_READY,
- WAVEOUT_PLAYING, WAVEOUT_ERR,
- WAVEOUT_PAUSED, WAVEOUT_STOP
-
- };
+ WAVEOUT_PLAYING, WAVEOUT_FLUSHING,
+ WAVEOUT_PAUSED, WAVEOUT_STOP,
+ WAVEOUT_ERR,
+
+ };
+
+
+
class audio_waveout
{
- friend class audio_buffer;
+ friend class audio_buffer;
+
+
+
+ private:
+
+
+ static DWORD WINAPI
+ playing_procedure( LPVOID );
+
+
+
+ HANDLE wakeup_playthread;
+
+
+
+
+ protected:
+
+
+ WAVEFORMATEX wave_format;
+ WAVEHDR * wave_headers;
+ HWAVEOUT waveout_handle;
+
+
+
+
+
+ const audio_format & aud_info;
+ audio_producer & audio_buf;
+
+
+
+
+
+
+ //
+ // Audio Playing Thread id
+ //
+ DWORD playthread_id;
- private:
- static DWORD WINAPI playing_procedure( LPVOID );
+ audio_waveout_status status;
-
- HANDLE wakeup_playthread;
-
- protected:
+ float buf_secs;
-
- WAVEFORMATEX wave_format;
- WAVEHDR * wave_headers;
- HWAVEOUT waveout_handle;
-
-
-
- const audio_format & aud_info;
- audio_producer & audio_buf;
+ //
+ // The temporary buffers for the audio
+ // data outgoing to the waveout device
+ // and its size, and its total number.
+ //
-
+ //base address for entire memory
+ BYTE * main_buffer;
+ //size in bytes for the entire memory
+ unsigned int mb_size;
+ //number of little buffers
+ unsigned int buffers;
- //
- // Audio Playing Thread id
- //
- DWORD playthread_id;
+
+ //
+ // Protected Functions
+ //
+ void init_( void );
+ void alloc_buffers_mem_( unsigned int, float );
+ void free_buffers_mem_( void );
- audio_waveout_status status;
+ void init_headers_( void );
+ void prep_headers_( void );
+ void unprep_headers_( void );
- float buf_secs;
+
- //
- // The temporary buffers for the audio
- // data outgoing to the waveout device
- // and its size, and its total number.
- //
+ public:
+ //
+ // Ctors
+ //
- //base address for entire memory
- BYTE * main_buffer;
+ audio_waveout( const audio_format & aud_fmt,
+ audio_producer & a_buf )
- //size in bytes for the entire memory
- unsigned int mb_size;
+ : wave_headers( 0 ), aud_info( aud_fmt ),
+ audio_buf( a_buf ), status( WAVEOUT_NOTREADY ),
+ main_buffer( 0 ), mb_size( 0 ),
+ buffers( _AUDIO_DEFAULT_WAVEOUTBUFFERS )
+ {
- //number of little buffers
- unsigned int buffers;
+ //
+ // Initializing internal wavein data
+ //
+
+
+ init_();
+ }
-
+
- //
- // Protected Functions
- //
+
+ //
+ // Dtor
+ //
- void init_( void );
- void alloc_buffers_mem_( unsigned int, float );
- void free_buffers_mem_( void );
+ ~audio_waveout( void )
+ { }
- void init_headers_( void );
- void prep_headers_( void );
- void unprep_headers_( void );
+ //
+ // Public Functions
+ //
-
+ void open ( void );
+ void play ( void );
+ void pause ( void );
+ void stop ( void );
+ void close ( void );
+ audio_waveout_status current_status( void )
+ { return status; }
- public:
- //
- // Ctors
- //
- audio_waveout( const audio_format & aud_fmt,
- audio_producer & a_buf )
- : wave_headers( 0 ), aud_info( aud_fmt ),
- audio_buf( a_buf ), status( WAVEOUT_NOTREADY ),
- main_buffer( 0 ), mb_size( 0 ),
- buffers( _AUDIO_DEFAULT_WAVEOUTBUFFERS )
- {
+ BYTE * buf( void ) { return main_buffer; }
+ unsigned int bufsz( void ) { return mb_size; }
- //
- // Initializing internal wavein data
- //
-
-
- init_();
- }
+ unsigned int samplevalue_max( void )
+ {
-
+ if ( aud_info.bits() == 16 )
+ return (unsigned int )65535;
+ else if ( aud_info.bits() == 8 )
+ return (unsigned int)255;
+ else
+ return 0;
+ }
-
- //
- // Dtor
- //
- ~audio_waveout( void )
- { }
+ unsigned tot_samples_buf( void )
+ {
+ return aud_info.samples_in_bytes( mb_size );
- //
- // Public Functions
- //
+ }
- void open ( void );
- void play ( void );
- void pause ( void );
- void stop ( void );
- void close ( void );
+ unsigned int nsample ( unsigned int nsamp )
+ {
- audio_waveout_status current_status( void )
- { return status; }
+ unsigned int svalue;
+ if ( aud_info.bits() == 16 )
+ svalue = ( unsigned int ) abs( *(( short * ) (main_buffer + aud_info.bytes_in_samples( nsamp ))));
+ else if ( aud_info.bits() == 8 )
+ svalue = (unsigned int)(( unsigned char * ) *(main_buffer + aud_info.bytes_in_samples( nsamp )));
+ else
+ svalue = 0;
+ return svalue;
+ }
};