+/* 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"
-enum audio_waveout_status { WAVEOUT_NOTREADY, WAVEOUT_READY,
- WAVEOUT_PLAYING, WAVEOUT_ERR,
- WAVEOUT_PAUSED, WAVEOUT_STOP
-
- };
+enum audio_waveout_status { WAVEOUT_NOTREADY, WAVEOUT_READY,
+ 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;
- private:
+
- static DWORD WINAPI playing_procedure( LPVOID );
+ protected:
+
+ WAVEFORMATEX wave_format;
+ WAVEHDR * wave_headers;
+ HWAVEOUT waveout_handle;
+
+
- HANDLE wakeup_playthread;
+
+ const audio_format & aud_info;
+ audio_producer & audio_buf;
+
- protected:
+ //
+ // Audio Playing Thread id
+ //
- WAVEFORMATEX wave_format;
- WAVEHDR * wave_headers;
- HWAVEOUT waveout_handle;
+ DWORD playthread_id;
- const audio_format & aud_info;
- audio_producer & audio_buf;
+ audio_waveout_status status;
+ float buf_secs;
- //
- // Audio Playing Thread id
- //
- DWORD playthread_id;
+ //
+ // 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_waveout_status status;
+
- float buf_secs;
+ //
+ // Protected Functions
+ //
+ void init_( void );
+ void alloc_buffers_mem_( unsigned int, float );
+ void free_buffers_mem_( void );
- //
- // The temporary buffers for the audio
- // data outgoing to the waveout device
- // and its size, and its total number.
- //
+ void init_headers_( void );
+ void prep_headers_( void );
+ void unprep_headers_( void );
- //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;
+ 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 )
+ {
- //
- // Protected Functions
- //
+ //
+ // Initializing internal wavein data
+ //
+
+
+ init_();
- void init_( void );
- void alloc_buffers_mem_( unsigned int, float );
- void free_buffers_mem_( void );
+ }
+
- void init_headers_( void );
- void prep_headers_( void );
- void unprep_headers_( void );
+
+ //
+ // Dtor
+ //
+ ~audio_waveout( void )
+ { }
- public:
+ //
+ // Public Functions
+ //
- //
- // Ctors
- //
+ void open ( void );
+ void play ( void );
+ void pause ( void );
+ void stop ( void );
+ void close ( void );
- 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 )
- {
+ audio_waveout_status current_status( void )
+ { return status; }
- //
- // Initializing internal wavein data
- //
- init_();
- }
+ BYTE * buf( void ) { return main_buffer; }
+ unsigned int bufsz( void ) { return mb_size; }
+ 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)(( ptrdiff_t ) *(main_buffer + aud_info.bytes_in_samples( nsamp )));
+ else
+ svalue = 0;
+ return svalue;
+ }
};