annotate foosdk/sdk/foobar2000/SDK/audio_chunk.h @ 1:20d02a178406 default tip

*: check in everything else yay
author Paper <paper@tflc.us>
date Mon, 05 Jan 2026 02:15:46 -0500
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1 #pragma once
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3 #include <pfc/audio_sample.h>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4 #include <pfc/memalign.h>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5 #include "exception_io.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 #ifdef _WIN32
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 #include <MMReg.h>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 //! Thrown when audio_chunk sample rate or channel mapping changes in mid-stream and the code receiving audio_chunks can't deal with that scenario.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11 PFC_DECLARE_EXCEPTION(exception_unexpected_audio_format_change, exception_io_data, "Unexpected audio format change" );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 //! Interface to container of a chunk of audio data. See audio_chunk_impl for an implementation.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 class NOVTABLE audio_chunk {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 struct spec_t; // forward decl
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 enum {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 sample_rate_min = 1000, sample_rate_max = 20000000
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 static bool g_is_valid_sample_rate(t_uint32 p_val) {return p_val >= sample_rate_min && p_val <= sample_rate_max;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23 //! Channel map flag declarations. Note that order of interleaved channel data in the stream is same as order of these flags.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 enum
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 channel_front_left = 1<<0,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 channel_front_right = 1<<1,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 channel_front_center = 1<<2,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 channel_lfe = 1<<3,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 channel_back_left = 1<<4,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 channel_back_right = 1<<5,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 channel_front_center_left = 1<<6,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 channel_front_center_right = 1<<7,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 channel_back_center = 1<<8,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 channel_side_left = 1<<9,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 channel_side_right = 1<<10,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 channel_top_center = 1<<11,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 channel_top_front_left = 1<<12,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 channel_top_front_center = 1<<13,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 channel_top_front_right = 1<<14,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 channel_top_back_left = 1<<15,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 channel_top_back_center = 1<<16,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 channel_top_back_right = 1<<17,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 channels_back_left_right = channel_back_left | channel_back_right,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 channels_side_left_right = channel_side_left | channel_side_right,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 channel_config_mono = channel_front_center,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 channel_config_stereo = channel_front_left | channel_front_right,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 channel_config_2point1 = channel_config_stereo | channel_lfe,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 channel_config_3point0 = channel_config_stereo | channel_front_center,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 channel_config_4point0 = channel_config_stereo | channels_back_left_right,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53 channel_config_4point0_side = channel_config_stereo | channels_side_left_right,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 channel_config_4point1 = channel_config_4point0 | channel_lfe,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 channel_config_5point0 = channel_config_4point0 | channel_front_center,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 channel_config_6point0 = channel_config_4point0 | channels_side_left_right,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57 channel_config_5point1 = channel_config_4point0 | channel_front_center | channel_lfe,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 channel_config_5point1_side = channel_config_4point0_side | channel_front_center | channel_lfe,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 channel_config_7point1 = channel_config_5point1 | channels_side_left_right,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62 defined_channel_count = 18,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65 //! Helper function; guesses default channel map for the specified channel count. Returns 0 on failure.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 static unsigned g_guess_channel_config(unsigned count);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67 //! Helper function; determines channel map for the specified channel count according to Xiph specs. Throws exception_io_data on failure.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 static unsigned g_guess_channel_config_xiph(unsigned count);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70 //! Helper function; translates audio_chunk channel map to WAVEFORMATEXTENSIBLE channel map.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71 static constexpr uint32_t g_channel_config_to_wfx(unsigned p_config) { return p_config;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72 //! Helper function; translates WAVEFORMATEXTENSIBLE channel map to audio_chunk channel map.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73 static constexpr unsigned g_channel_config_from_wfx(uint32_t p_wfx) { return p_wfx;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75 //! Extracts flag describing Nth channel from specified map. Usable to figure what specific channel in a stream means.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76 static unsigned g_extract_channel_flag(unsigned p_config,unsigned p_index);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77 //! Counts channels specified by channel map.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78 static constexpr unsigned g_count_channels(unsigned p_config) { return pfc::countBits32(p_config); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
79 //! Calculates index of a channel specified by p_flag in a stream where channel map is described by p_config.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80 static unsigned g_channel_index_from_flag(unsigned p_config,unsigned p_flag);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
82 static const char * g_channel_name(unsigned p_flag);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
83 static const char * g_channel_name_byidx(unsigned p_index);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
84 static unsigned g_find_channel_idx(unsigned p_flag);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
85 static void g_formatChannelMaskDesc(unsigned flags, pfc::string_base & out);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
86 static pfc::string8 g_formatChannelMaskDesc(unsigned flags);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
87 static const char* g_channelMaskName(unsigned flags);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
88
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
89
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
90
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
91 //! Retrieves audio data buffer pointer (non-const version). Returned pointer is for temporary use only; it is valid until next set_data_size call, or until the object is destroyed. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
92 //! Size of returned buffer is equal to get_data_size() return value (in audio_samples). Amount of actual data may be smaller, depending on sample count and channel count. Conditions where sample count * channel count are greater than data size should not be possible.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
93 virtual audio_sample * get_data() = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
94 //! Retrieves audio data buffer pointer (const version). Returned pointer is for temporary use only; it is valid until next set_data_size call, or until the object is destroyed. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
95 //! Size of returned buffer is equal to get_data_size() return value (in audio_samples). Amount of actual data may be smaller, depending on sample count and channel count. Conditions where sample count * channel count are greater than data size should not be possible.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
96 virtual const audio_sample * get_data() const = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
97 //! Retrieves size of allocated buffer space, in audio_samples.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
98 virtual t_size get_data_size() const = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
99 //! Resizes audio data buffer to specified size. Throws std::bad_alloc on failure.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
100 virtual void set_data_size(t_size p_new_size) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
101 //! Sanity helper, same as set_data_size.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
102 //! @param bQuicker Avoid memory allocation, permit up to 2x memory used
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
103 void allocate(size_t size, bool bQuicker = false);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
104
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
105 //! Retrieves sample rate of contained audio data.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
106 virtual unsigned get_srate() const = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
107 //! Sets sample rate of contained audio data.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
108 virtual void set_srate(unsigned val) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
109 //! Retrieves channel count of contained audio data.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
110 virtual unsigned get_channels() const = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
111 //! Helper - for consistency - same as get_channels().
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
112 inline unsigned get_channel_count() const {return get_channels();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
113 //! Retrieves channel map of contained audio data. Conditions where number of channels specified by channel map don't match get_channels() return value should not be possible.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
114 virtual unsigned get_channel_config() const = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
115 //! Sets channel count / channel map.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
116 virtual void set_channels(unsigned p_count,unsigned p_config) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
117
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
118 //! Retrieves number of valid samples in the buffer. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
119 //! Note that a "sample" means a unit of interleaved PCM data representing states of each channel at given point of time, not a single PCM value. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
120 //! For an example, duration of contained audio data is equal to sample count / sample rate, while actual size of contained data is equal to sample count * channel count.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
121 virtual t_size get_sample_count() const = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
122
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
123 //! Sets number of valid samples in the buffer. WARNING: sample count * channel count should never be above allocated buffer size.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
124 virtual void set_sample_count(t_size val) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
125
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
126 //! Helper, same as get_srate().
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
127 inline unsigned get_sample_rate() const {return get_srate();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
128 //! Helper, same as set_srate().
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
129 inline void set_sample_rate(unsigned val) {set_srate(val);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
130
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
131 //! Helper; sets channel count to specified value and uses default channel map for this channel count.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
132 void set_channels(unsigned val) {set_channels(val,g_guess_channel_config(val));}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
133
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
134
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
135 //! Helper; resizes audio data buffer when its current size is smaller than requested.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
136 inline void grow_data_size(t_size p_requested) {if (p_requested > get_data_size()) set_data_size(p_requested);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
137
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
138
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
139 //! Retrieves duration of contained audio data, in seconds.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
140 inline double get_duration() const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
141 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
142 double rv = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
143 t_size srate = get_srate (), samples = get_sample_count();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
144 if (srate>0 && samples>0) rv = (double)samples/(double)srate;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
145 return rv;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
146 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
147
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
148 //! Returns whether the chunk is empty (contains no audio data).
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
149 inline bool is_empty() const {return get_channels()==0 || get_srate()==0 || get_sample_count()==0;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
150
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
151 //! Returns whether the chunk contents are valid (for bug check purposes).
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
152 bool is_valid() const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
153
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
154 void debugChunkSpec() const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
155 pfc::string8 formatChunkSpec() const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
156 #if PFC_DEBUG
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
157 void assert_valid(const char * ctx) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
158 #else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
159 void assert_valid(const char* ctx) const { (void)ctx; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
160 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
161
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
162
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
163 //! Returns whether the chunk contains valid sample rate & channel info (but allows an empty chunk).
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
164 bool is_spec_valid() const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
165
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
166 //! Returns actual amount of audio data contained in the buffer (sample count * channel count). Must not be greater than data size (see get_data_size()).
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
167 size_t get_used_size() const {return get_sample_count() * get_channels();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
168 //! Same as get_used_size(); old confusingly named version.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
169 size_t get_data_length() const {return get_sample_count() * get_channels();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
170
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
171 //! Resets all audio_chunk data.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
172 inline void reset() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
173 set_sample_count(0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
174 set_srate(0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
175 set_channels(0,0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
176 set_data_size(0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
177 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
178
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
179 //! Helper, sets chunk data to contents of specified buffer, with specified number of channels / sample rate / channel map.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
180 void set_data(const audio_sample * src,size_t samples,unsigned nch,unsigned srate,unsigned channel_config);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
181 void set_data(const audio_sample* src, size_t samples, spec_t const& spec, bool bQucker = false);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
182 void set_data(const audio_sample* src, t_size samples, unsigned nch, unsigned srate);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
183
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
184 void set_data_int16(const int16_t * src,t_size samples,unsigned nch,unsigned srate,unsigned channel_config);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
185
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
186 //! Helper, sets chunk data to contents of specified buffer, using default win32/wav conventions for signed/unsigned switch.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
187 inline void set_data_fixedpoint(const void * ptr,t_size bytes,unsigned srate,unsigned nch,unsigned bps,unsigned channel_config) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
188 this->set_data_fixedpoint_ms(ptr, bytes, srate, nch, bps, channel_config);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
189 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
190
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
191 void set_data_fixedpoint_signed(const void * ptr,t_size bytes,unsigned srate,unsigned nch,unsigned bps,unsigned channel_config);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
192
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
193 enum
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
194 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
195 FLAG_LITTLE_ENDIAN = 1,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
196 FLAG_BIG_ENDIAN = 2,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
197 FLAG_SIGNED = 4,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
198 FLAG_UNSIGNED = 8,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
199 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
200
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
201 inline static unsigned flags_autoendian() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
202 return pfc::byte_order_is_big_endian ? FLAG_BIG_ENDIAN : FLAG_LITTLE_ENDIAN;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
203 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
204
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
205 void set_data_fixedpoint_ex(const void * ptr,t_size bytes,unsigned p_sample_rate,unsigned p_channels,unsigned p_bits_per_sample,unsigned p_flags,unsigned p_channel_config);//p_flags - see FLAG_* above
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
206
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
207 void set_data_fixedpoint_ms(const void * ptr, size_t bytes, unsigned sampleRate, unsigned channels, unsigned bps, unsigned channelConfig);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
208
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
209 void set_data_floatingpoint_ex(const void * ptr,t_size bytes,unsigned p_sample_rate,unsigned p_channels,unsigned p_bits_per_sample,unsigned p_flags,unsigned p_channel_config);//signed/unsigned flags dont apply
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
210 static bool is_supported_floatingpoint(unsigned bps) { return bps == 32 || bps == 64 || bps == 16 || bps == 24; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
211
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
212 void set_data_32(const float* src, t_size samples, unsigned nch, unsigned srate);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
213 void set_data_32(const float* src, t_size samples, spec_t const & spec );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
214
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
215 //! Appends silent samples at the end of the chunk. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
216 //! The chunk may be empty prior to this call, its sample rate & channel count will be set to the specified values then. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
217 //! The chunk may have different sample rate than requested; silent sample count will be recalculated to the used sample rate retaining actual duration.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
218 //! @param samples Number of silent samples to append.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
219 //! @param hint_nch If no channel count is set on this chunk, it will be set to this value.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
220 //! @param hint_srate The sample rate of silent samples being inserted. If no sampler ate is set on this chunk, it will be set to this value.\n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
221 //! Otherwise if chunk's sample rate doesn't match hint_srate, sample count will be recalculated to chunk's actual sample rate.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
222 void pad_with_silence_ex(t_size samples,unsigned hint_nch,unsigned hint_srate);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
223 //! Appends silent samples at the end of the chunk. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
224 //! The chunk must have valid sample rate & channel count prior to this call.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
225 //! @param samples Number of silent samples to append.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
226 void pad_with_silence(t_size samples);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
227 //! Inserts silence at the beginning of the audio chunk.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
228 //! @param samples Number of silent samples to insert.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
229 void insert_silence_fromstart(t_size samples);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
230 //! Helper; removes N first samples from the chunk. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
231 //! If the chunk contains fewer samples than requested, it becomes empty.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
232 //! @returns Number of samples actually removed.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
233 t_size skip_first_samples(t_size samples);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
234 //! Produces a chunk of silence, with the specified duration. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
235 //! Any existing audio sdata will be discarded. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
236 //! Expects sample rate and channel count to be set first. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
237 //! Also allocates memory for the requested amount of data see: set_data_size().
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
238 //! @param samples Desired number of samples.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
239 void set_silence(t_size samples);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
240 //! Produces a chunk of silence, with the specified duration. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
241 //! Any existing audio sdata will be discarded. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
242 //! Expects sample rate and channel count to be set first. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
243 //! Also allocates memory for the requested amount of data see: set_data_size().
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
244 //! @param seconds Desired duration in seconds.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
245 void set_silence_seconds( double seconds );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
246
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
247 //! Helper; skips first samples of the chunk updating a remaining to-skip counter.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
248 //! @param skipDuration Reference to the duration of audio remining to be skipped, in seconds. Updated by each call.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
249 //! @returns False if the chunk became empty, true otherwise.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
250 bool process_skip(double & skipDuration);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
251
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
252 //! Simple function to get original PCM stream back. Assumes host's endianness, integers are signed - including the 8bit mode; 32bit mode assumed to be float.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
253 //! @returns false when the conversion could not be performed because of unsupported bit depth etc.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
254 bool to_raw_data(class mem_block_container & out, t_uint32 bps, bool useUpperBits = true, audio_sample scale = 1.0) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
255
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
256 //! Convert audio_chunk contents to fixed-point PCM format.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
257 //! @param useUpperBits relevant if bps != bpsValid, signals whether upper or lower bits of each sample should be used.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
258 bool toFixedPoint(class mem_block_container & out, uint32_t bps, uint32_t bpsValid, bool useUpperBits = true, audio_sample scale = 1.0) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
259
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
260 //! Convert a buffer of audio_samples to fixed-point PCM format.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
261 //! @param useUpperBits relevant if bps != bpsValid, signals whether upper or lower bits of each sample should be used.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
262 static bool g_toFixedPoint(const audio_sample * in, void * out, size_t count, uint32_t bps, uint32_t bpsValid, bool useUpperBits = true, audio_sample scale = 1.0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
263
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
264
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
265 //! Helper, calculates peak value of data in the chunk. The optional parameter specifies initial peak value, to simplify calling code.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
266 audio_sample get_peak(audio_sample p_peak) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
267 audio_sample get_peak() const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
268
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
269 //! Helper function; scales entire chunk content by specified value.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
270 void scale(audio_sample p_value);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
271
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
272 //! Helper; copies content of another audio chunk to this chunk.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
273 //! @param bQuicker Avoid memory allocation, permit up to 2x memory used
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
274 void copy(const audio_chunk & p_source, bool bQuicker = false) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
275 set_data(p_source.get_data(),p_source.get_sample_count(),p_source.get_spec(), bQuicker);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
276 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
277
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
278 const audio_chunk & operator=(const audio_chunk & p_source) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
279 copy(p_source);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
280 return *this;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
281 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
282
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
283 struct spec_t {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
284 uint32_t sampleRate = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
285 uint32_t chanCount = 0, chanMask = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
286
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
287 static bool equals( const spec_t & v1, const spec_t & v2 );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
288 bool operator==(const spec_t & other) const { return equals(*this, other);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
289 bool operator!=(const spec_t & other) const { return !equals(*this, other);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
290 bool is_valid() const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
291 void clear() { sampleRate = 0; chanCount = 0; chanMask = 0; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
292
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
293 #ifdef _WIN32
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
294 //! Creates WAVE_FORMAT_IEEE_FLOAT WAVEFORMATEX structure
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
295 WAVEFORMATEX toWFX() const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
296 //! Creates WAVE_FORMAT_IEEE_FLOAT WAVEFORMATEXTENSIBLE structure
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
297 WAVEFORMATEXTENSIBLE toWFXEX() const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
298 //! Creates WAVE_FORMAT_PCM WAVEFORMATEX structure
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
299 WAVEFORMATEX toWFXWithBPS(uint32_t bps) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
300 //! Creates WAVE_FORMAT_PCM WAVEFORMATEXTENSIBLE structure
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
301 WAVEFORMATEXTENSIBLE toWFXEXWithBPS(uint32_t bps) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
302 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
303
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
304 pfc::string8 toString( const char * delim = " " ) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
305 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
306 static spec_t makeSpec(uint32_t rate, uint32_t channels);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
307 static spec_t makeSpec(uint32_t rate, uint32_t channels, uint32_t chanMask);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
308 static spec_t emptySpec() { return makeSpec(0, 0, 0); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
309
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
310 spec_t get_spec() const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
311 void set_spec(const spec_t &);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
312
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
313 void append(const audio_chunk& other);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
314 protected:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
315 audio_chunk() {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
316 ~audio_chunk() {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
317 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
318
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
319 //! Implementation of audio_chunk. Takes pfc allocator template as template parameter.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
320 template<typename container_t = pfc::mem_block_aligned_t<audio_sample, 16> >
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
321 class audio_chunk_impl_t : public audio_chunk {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
322 typedef audio_chunk_impl_t<container_t> t_self;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
323 container_t m_data;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
324 unsigned m_srate = 0, m_nch = 0, m_setup = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
325 t_size m_samples = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
326
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
327 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
328 audio_chunk_impl_t() {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
329 audio_chunk_impl_t(const audio_sample * src,unsigned samples,unsigned nch,unsigned srate) {set_data(src,samples,nch,srate);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
330 audio_chunk_impl_t(const audio_chunk & p_source) {copy(p_source);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
331
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
332
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
333 virtual audio_sample * get_data() {return m_data.get_ptr();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
334 virtual const audio_sample * get_data() const {return m_data.get_ptr();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
335 virtual t_size get_data_size() const {return m_data.get_size();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
336 virtual void set_data_size(t_size new_size) {m_data.set_size(new_size);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
337
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
338 virtual unsigned get_srate() const {return m_srate;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
339 virtual void set_srate(unsigned val) {m_srate=val;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
340 virtual unsigned get_channels() const {return m_nch;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
341 virtual unsigned get_channel_config() const {return m_setup;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
342 virtual void set_channels(unsigned val,unsigned setup) {m_nch = val;m_setup = setup;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
343 void set_channels(unsigned val) {set_channels(val,g_guess_channel_config(val));}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
344
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
345 virtual t_size get_sample_count() const {return m_samples;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
346 virtual void set_sample_count(t_size val) {m_samples = val;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
347
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
348 const t_self & operator=(const audio_chunk & p_source) {copy(p_source);return *this;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
349 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
350
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
351 typedef audio_chunk_impl_t<> audio_chunk_impl;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
352 typedef audio_chunk_impl_t<pfc::mem_block_aligned_incremental_t<audio_sample, 16> > audio_chunk_fast_impl;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
353
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
354 //! Implements const methods of audio_chunk only, referring to an external buffer. For temporary use only (does not maintain own storage), e.g.: somefunc( audio_chunk_temp_impl(mybuffer,....) );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
355 class audio_chunk_memref_impl : public audio_chunk {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
356 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
357 audio_chunk_memref_impl(const audio_sample * p_data,t_size p_samples,t_uint32 p_sample_rate,t_uint32 p_channels,t_uint32 p_channel_config) :
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
358 m_samples(p_samples), m_sample_rate(p_sample_rate), m_channels(p_channels), m_channel_config(p_channel_config), m_data(p_data)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
359 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
360 #if PFC_DEBUG
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
361 assert_valid(__FUNCTION__);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
362 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
363 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
364
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
365 audio_sample * get_data() {throw pfc::exception_not_implemented();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
366 const audio_sample * get_data() const {return m_data;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
367 t_size get_data_size() const {return m_samples * m_channels;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
368 void set_data_size(t_size) {throw pfc::exception_not_implemented();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
369
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
370 unsigned get_srate() const {return m_sample_rate;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
371 void set_srate(unsigned) {throw pfc::exception_not_implemented();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
372 unsigned get_channels() const {return m_channels;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
373 unsigned get_channel_config() const {return m_channel_config;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
374 void set_channels(unsigned,unsigned) {throw pfc::exception_not_implemented();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
375
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
376 t_size get_sample_count() const {return m_samples;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
377
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
378 void set_sample_count(t_size) {throw pfc::exception_not_implemented();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
379
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
380 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
381 t_size m_samples;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
382 t_uint32 m_sample_rate,m_channels,m_channel_config;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
383 const audio_sample * m_data;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
384 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
385
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
386
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
387 // Compatibility typedefs.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
388 typedef audio_chunk_fast_impl audio_chunk_impl_temporary;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
389 typedef audio_chunk_impl audio_chunk_i;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
390 typedef audio_chunk_memref_impl audio_chunk_temp_impl;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
391
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
392 class audio_chunk_partial_ref : public audio_chunk_temp_impl {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
393 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
394 audio_chunk_partial_ref(const audio_chunk & chunk, t_size base, t_size count) : audio_chunk_temp_impl(chunk.get_data() + base * chunk.get_channels(), count, chunk.get_sample_rate(), chunk.get_channels(), chunk.get_channel_config()) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
395 };