mirror of
https://github.com/reactos/reactos.git
synced 2024-08-26 21:28:48 +00:00
194 lines
5 KiB
C++
194 lines
5 KiB
C++
/* 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_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 previously 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 length 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 /* _AUDIOWAVEIN_H_ */
|