mirror of
https://github.com/reactos/reactos.git
synced 2024-10-30 03:27:31 +00:00
6afbc8f483
svn path=/branches/reactos-yarotows/; revision=45219
347 lines
7 KiB
C++
347 lines
7 KiB
C++
/* 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_
|