--- /dev/null
- svalue = (unsigned int)(( unsigned char * ) *(main_buffer + aud_info.bytes_in_samples( nsamp )));
+/* PROJECT: ReactOS sndrec32
+ * LICENSE: GPL - See COPYING in the top level directory
+ * FILE: base/applications/sndrec32/audio_wavein.hpp
+ * PURPOSE: Windows MM wave in abstraction
+ * PROGRAMMERS: Marco Pagliaricci (irc: rendar)
+ */
+
+
+#ifndef _AUDIOWAVEIN_H_
+#define _AUDIOWAVEIN_H_
+
+
+
+#include "audio_def.hpp"
+#include "audio_format.hpp"
+#include "audio_receiver.hpp"
+
+
+
+_AUDIO_NAMESPACE_START_
+
+
+
+
+enum audio_wavein_status { WAVEIN_NOTREADY, WAVEIN_READY,
+ WAVEIN_RECORDING, WAVEIN_ERR,
+ WAVEIN_STOP, WAVEIN_FLUSHING
+
+ };
+
+
+
+
+
+class audio_wavein
+{
+ private:
+
+
+
+ //
+ // The new recording thread sends message to this procedure
+ // about open recording, close, and sound data recorded
+ //
+
+ static DWORD WINAPI recording_procedure( LPVOID );
+
+ //
+ // When this event is signaled, then the previsiously created
+ // recording thread will wake up and start recording audio
+ // and will pass audio data to an `audio_receiver' object.
+ //
+
+ HANDLE wakeup_recthread;
+ HANDLE data_flushed_event;
+
+
+
+
+ protected:
+
+
+//TODO: puts these structs in private?!
+
+
+
+
+ //
+ // Audio wavein device stuff
+ //
+
+ WAVEFORMATEX wave_format;
+ WAVEHDR * wave_headers;
+ HWAVEIN wavein_handle;
+
+
+
+
+
+ audio_format aud_info;
+
+ audio_receiver & audio_rcvd;
+
+
+
+ //
+ // Audio Recorder Thread id
+ //
+
+ DWORD recthread_id;
+
+
+
+
+ //
+ // Object status
+ //
+
+ audio_wavein_status status;
+
+
+
+
+
+
+
+ //
+ // How many seconds of audio
+ // can record the internal buffer
+ // before flushing audio data
+ // to the `audio_receiver' class?
+ //
+
+ float buf_secs;
+
+
+ //
+ // The temporary buffers for the audio
+ // data incoming from the wavein device
+ // and its size, and its total number.
+ //
+
+ BYTE * main_buffer;
+ unsigned int mb_size;
+
+ unsigned int buffers;
+
+
+
+
+
+ //
+ // Protected Functions
+ //
+
+
+ //initialize all structures and variables.
+ 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 );
+ void add_buffers_to_driver_( void );
+
+
+
+
+
+
+
+ public:
+
+
+ //
+ // Ctors
+ //
+
+ audio_wavein(
+ const audio_format & a_info, audio_receiver & a_receiver )
+
+ : wave_headers( 0 ),
+ aud_info( a_info ), audio_rcvd( a_receiver ),
+ status( WAVEIN_NOTREADY ), main_buffer( 0 ), mb_size( 0 ),
+ buffers( _AUDIO_DEFAULT_WAVEINBUFFERS )
+ {
+
+ //
+ // Initializing internal wavein data
+ //
+
+
+ init_();
+
+ aud_info = a_info;
+ }
+
+
+
+
+
+
+
+ //
+ // Dtor
+ //
+
+ ~audio_wavein( void )
+ {
+
+ //close(); TODO!
+
+ }
+
+
+
+ //
+ // Public functions
+ //
+
+ void open( void );
+ void close ( void );
+
+
+ void start_recording( void );
+ void stop_recording( void );
+
+
+
+ audio_wavein_status current_status ( void ) const
+ {
+ return status;
+ }
+
+ float buffer_secs( void ) const
+ { return buf_secs; }
+
+
+ void buffer_secs( float bsecs )
+ {
+ //
+ // Some checking
+ //
+
+ if ( bsecs <= 0 )
+ return;
+
+
+ //
+ // Set seconds lenght for each
+ // buffer.
+ //
+
+ buf_secs = bsecs;
+ }
+
+
+ unsigned int total_buffers( void ) const
+ { return buffers; }
+
+
+
+ void total_buffers( unsigned int tot_bufs )
+ {
+
+ //
+ // Some checking
+ //
+
+ if ( tot_bufs == 0 )
+ return;
+
+
+ //
+ // Sets the number of total buffers.
+ //
+
+ buffers = tot_bufs;
+ }
+
+
+ audio_format format( void ) const
+ { return aud_info; }
+
+
+
+
+ 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;
+ }
+
+
+ unsigned tot_samples_buf( void )
+ {
+
+
+ return aud_info.samples_in_bytes( mb_size );
+
+
+ }
+
+ unsigned int nsample ( unsigned int nsamp )
+ {
+
+
+ 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;
+
+ }
+
+
+};
+
+
+
+
+_AUDIO_NAMESPACE_END_
+
+
+
+
+#endif //ifdef _AUDIOWAVEIN_H_
--- /dev/null
- svalue = (unsigned int)(( unsigned char * ) *(main_buffer + aud_info.bytes_in_samples( nsamp )));
+/* 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_FLUSHING,
+ WAVEOUT_PAUSED, WAVEOUT_STOP,
+ WAVEOUT_ERR,
+
+ };
+
+
+
+
+
+class audio_waveout
+{
+
+ 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;
+
+
+
+
+
+ audio_waveout_status status;
+
+
+
+
+ float buf_secs;
+
+
+
+ //
+ // 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;
+
+
+
+
+
+
+ //
+ // Protected Functions
+ //
+
+ 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 );
+
+
+
+
+
+
+
+ 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 )
+ {
+
+ //
+ // Initializing internal wavein data
+ //
+
+
+ init_();
+
+ }
+
+
+
+
+
+
+ //
+ // Dtor
+ //
+
+ ~audio_waveout( 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; }
+
+
+
+
+ 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;
+ }
+
+
+ unsigned tot_samples_buf( void )
+ {
+
+
+ return aud_info.samples_in_bytes( mb_size );
+
+
+ }
+
+ unsigned int nsample ( unsigned int nsamp )
+ {
+
+
+ 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;
+
+ }
+
+
+};
+
+
+
+_AUDIO_NAMESPACE_END_
+
+
+
+
+#endif //ifdef _AUDIOWAVEOUT__H_