reactos/base/applications/sndrec32/audio_membuffer.hpp

347 lines
7 KiB
C++
Raw Normal View History

/* PROJECT: ReactOS sndrec32
* LICENSE: GPL - See COPYING in the top level directory
* FILE: base/applications/sndrec32/audio_membuffer.hpp
* PURPOSE: Allocs audio buffer
* PROGRAMMERS: Marco Pagliaricci (irc: rendar)
*/
#ifndef _AUDIOMEMBUFFER__H_
#define _AUDIOMEMBUFFER__H_
#include "audio_def.hpp"
#include "audio_receiver.hpp"
#include "audio_format.hpp"
#include "audio_producer.hpp"
_AUDIO_NAMESPACE_START_
class audio_membuffer : public audio_receiver, public audio_producer
{
protected:
BYTE * audio_data;
audio_format aud_info;
unsigned int buf_size;
unsigned int init_size;
//
// Protected Functions
//
//allocs N bytes for the audio buffer.
void alloc_mem_( unsigned int );
//frees memory
void free_mem_( void );
//resizes memory, and copies old
//audio data to new-size memory
void resize_mem_( unsigned int );
//truncates and discards unused memory.
//`buf_size' will be the same as `bytes_received'.
void truncate_( void );
public:
void ( * audio_arrival )( unsigned int );
void ( * buffer_resized ) ( unsigned int );
//
// Ctors
//
audio_membuffer( void )
: audio_data( 0 ), aud_info( _AUDIO_DEFAULT_FORMAT ),
buf_size( 0 ), init_size( 0 )
{
//
// Allocs memory for at least 1 or some seconds
// of recording.
//
init_size = ( unsigned int )
(( float )aud_info.byte_rate() * _AUDIO_DEFAULT_BUFSECS );
alloc_mem_( init_size );
}
audio_membuffer( audio_format aud_fmt )
: audio_data( 0 ), aud_info( aud_fmt ), buf_size( 0 ),
init_size( 0 )
{
//
// Allocs memory for at least 1 or some seconds
// of recording.
//
init_size = ( unsigned int )
(( float )aud_info.byte_rate() * _AUDIO_DEFAULT_BUFSECS );
alloc_mem_( init_size );
}
audio_membuffer( audio_format aud_fmt, unsigned int seconds )
: audio_data( 0 ), aud_info( aud_fmt ), buf_size( 0 ),
init_size( 0 )
{
//
// Allocs memory for audio recording
// the specified number of seconds.
//
init_size = aud_info.byte_rate() * seconds;
alloc_mem_( init_size );
}
audio_membuffer( audio_format aud_fmt, float seconds )
: audio_data( 0 ), aud_info( aud_fmt ), buf_size( 0 ),
init_size( 0 )
{
//
// Allocs memory for audio recording
// the specified number of seconds.
//
init_size = ( unsigned int )(( float ) aud_info.byte_rate() *
seconds <= 0 ? 1 : seconds );
alloc_mem_( init_size );
}
audio_membuffer( unsigned int bytes )
: audio_data( 0 ), aud_info( _AUDIO_DEFAULT_FORMAT ),
buf_size( 0 ), init_size( 0 )
{
//
// Allocs memory for the specified bytes
//
init_size = bytes;
alloc_mem_( init_size );
}
//
// Dtor
//
virtual ~audio_membuffer( void )
{
//
// Frees memory and reset values.
//
clear();
}
//
// Public functions
//
//returns the audio buffer size in bytes.
unsigned int mem_size( void ) const
{ return buf_size; }
//returns how many audio data has been
//received, in bytes.
unsigned int bytes_recorded( void ) const
{ return bytes_received; }
//returns the integer number of seconds
//that the buffer can record
unsigned int seconds_total( void ) const
{ return buf_size / aud_info.byte_rate(); }
//returns the integer number of seconds
//that the buffer can record
unsigned int seconds_recorded( void ) const
{ return bytes_received / aud_info.byte_rate(); }
//returns the float number of seconds
//that the buffer can record
float fseconds_total( void ) const
{ return ( float )(( float ) buf_size /
( float ) aud_info.byte_rate()); }
//returns the float number of seconds
//that has been recorded
float fseconds_recorded( void ) const
{ return ( float )(( float ) bytes_received /
( float ) aud_info.byte_rate()); }
unsigned int total_samples( void ) const
{
return ( aud_info.samples_in_seconds( fseconds_total() ));
}
unsigned int samples_received( void ) const
{
return ( aud_info.samples_in_bytes( bytes_received ));
}
//returns a pointer to the audio buffer
BYTE * audio_buffer( void ) const
{ return audio_data; }
//frees memory and resets values.
void clear( void );
audio_format & audinfo( void ) { return aud_info; }
//discard audio data, resets values,
//but, instead of clear() which frees memory,
//reset the memory to the initial size, ready
//for receiving "new" audio data.
void reset( void );
//truncates and discards unused memory.
//`buf_size' will be the same as `bytes_received'.
void truncate( void )
{ truncate_( ); }//TODO: fare truncate N bytes
//if there is a buffer, discards current buffer
//memory and realloc a new memory buffer with a
//new size expressed in bytes.
void alloc_bytes( unsigned int );
//if there is a buffer, discards current buffer
//memory and realloc a new memory buffer with a
//new size expressed in seconds, integer and float.
void alloc_seconds( unsigned int );
void alloc_seconds( float );
//resizes in bytes the current buffer,
//without discarding previsiously audio data received.
void resize_bytes( unsigned int );
//resizes in seconds the current buffer,
//without discarding previsiously audio data received.
void resize_seconds( unsigned int );
void resize_seconds( float );
//
// Inherited Functions from `audio_receiver'
//
void audio_receive( unsigned char *, unsigned int );
//
// Inherited Functions from `audio_buffer'
//
unsigned int read( BYTE *, unsigned int );
bool finished( void );
};
_AUDIO_NAMESPACE_END_
#endif //ifdef _AUDIOMEMBUFFER__H_