65 unsigned bpsValid = p_bps;
66 unsigned bps = (p_bps + 7) & ~7;
67 initialize2(p_chunk, bps, bpsValid, p_float, p_dither, p_wave64);
72 p_wfx.wFormatTag =
m_float ? WAVE_FORMAT_IEEE_FLOAT : WAVE_FORMAT_PCM;
77 p_wfx.wBitsPerSample =
m_bps;
84 p_wfxe.Format.wFormatTag=WAVE_FORMAT_EXTENSIBLE;
85 p_wfxe.Format.cbSize=22;
86 p_wfxe.Samples.wValidBitsPerSample = this->
m_bpsValid;
88 p_wfxe.SubFormat =
m_float ? KSDATAFORMAT_SUBTYPE_IEEE_FLOAT : KSDATAFORMAT_SUBTYPE_PCM;
94 m_file->write_object_t(
id, abort);
96 for(
t_size walk = 0; walk < PFC_TABSIZE(RIFF_chunks); ++walk) {
97 if (
id == RIFF_chunks[walk].m_guid) {
98 m_file->write(RIFF_chunks[walk].m_name, 4, abort);
return;
107 if (size != ~0) size += 24;
108 m_file->write_lendian_t(size, abort);
111 if (size > 0xFFFFFFFF) clipped = 0xFFFFFFFF;
113 m_file->write_lendian_t(clipped, abort);
121 t_size delta = (val - (pos%val)) % val;
122 if (delta > 0)
m_file->write(dummy, delta, abort);
129 filesystem::g_open_write_new(l_file,p_path,p_abort);
130 open(l_file,p_setup,p_abort);
168 writeSize(
sizeof(WAVEFORMATEXTENSIBLE),p_abort);
170 WAVEFORMATEXTENSIBLE wfxe;
172 m_file->write_object(&wfxe,
sizeof(wfxe),p_abort);
174 writeSize(
sizeof(PCMWAVEFORMAT),p_abort);
178 m_file->write_object(&wfx,
sizeof(PCMWAVEFORMAT),p_abort);
201 )
throw exception_unexpected_audio_format_change();
210 #if audio_sample_size == 32
215 enum {tempsize = 256};
216 float temp[tempsize];
221 unsigned n,delta = todo;
222 if (delta > tempsize) delta = tempsize;
224 temp[n] = (
float)(*(readptr++));
225 unsigned bytes = delta *
sizeof(float);
226 m_file->write_object_e(temp,bytes,p_abort);
243 throw exception_io_data();
258 const size_t alignG =
align(p_abort);
t_uint64 m_offset_fix1_delta
void writeID(const GUID &id, abort_callback &abort)
void setup_wfx(WAVEFORMATEX &p_wfx)
service_ptr_t< audio_postprocessor > m_postprocessor
void setup_wfxe(WAVEFORMATEXTENSIBLE &p_wfx)
static const GUID guid_WAVE
Interface to container of a chunk of audio data. See audio_chunk_impl for an implementation.
GUID GUID_from_text(const char *text)
virtual unsigned get_channels() const =0
Retrieves channel count of contained audio data.
void write(const audio_chunk &p_chunk, abort_callback &p_abort)
const void * get_ptr() const
static const GUID guid_FMT
void initialize(const audio_chunk &p_chunk, unsigned p_bps, bool p_float, bool p_dither, bool p_wave64=false)
virtual unsigned get_srate() const =0
Retrieves sample rate of contained audio data.
virtual unsigned get_channel_config() const =0
Retrieves channel map of contained audio data. Conditions where number of channels specified by chann...
static unsigned g_count_channels(unsigned p_config)
Counts channels specified by channel map.
size_t align(abort_callback &abort)
void open(const char *p_path, const wavWriterSetup_t &p_setup, abort_callback &p_abort)
virtual audio_sample * get_data()=0
Retrieves audio data buffer pointer (non-const version). Returned pointer is for temporary use only; ...
audio_chunk::spec_t get_spec() const
mem_block_container_aligned_incremental_impl< 16 > m_postprocessor_output
static const GUID guid_DATA
PFC_DECLARE_EXCEPTION(exception_bad_cuesheet, exception_io_data,"Invalid cuesheet")
static const GUID guid_RIFF
void initialize2(const audio_chunk &p_chunk, unsigned p_bps, unsigned p_bpsValid, bool p_float, bool p_dither, bool p_wave64=false)
void finalize(abort_callback &p_abort)
service_ptr_t< file > m_file
t_uint64 t_filesize
Type used for file size related variables.
void initialize3(const audio_chunk::spec_t &spec, unsigned bps, unsigned bpsValid, bool bFloat, bool bDither, bool bWave64=false)
void writeSize(t_uint64 size, abort_callback &abort)
t_uint32 chunkOverhead() const
static bool g_is_valid_sample_rate(t_uint32 p_val)
PFC_NORETURN void SHARED_EXPORT uBugCheck()
static const RIFF_chunk_desc RIFF_chunks[]
virtual t_size get_sample_count() const =0
Retrieves number of valid samples in the buffer. Note that a "sample" means a unit of interleaved PC...
static uint32_t g_channel_config_to_wfx(unsigned p_config)
Helper function; translates audio_chunk channel map to WAVEFORMATEXTENSIBLE channel map...