- Merge from trunk up to r45543
[reactos.git] / base / applications / sndrec32 / audio_waveout.hpp
index fd8debe..a36518d 100644 (file)
+/* 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;
 
+        }
 
 
 };