annotate foosdk/sdk/foobar2000/SDK/audio_chunk.cpp @ 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 #include "foobar2000-sdk-pch.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2 #include "mem_block_container.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3 #include "audio_chunk.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5 void audio_chunk::allocate(size_t size, bool bQuicker) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6 if (bQuicker) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 const size_t before = this->get_data_size();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 const size_t allow_waste = pfc::max_t<size_t>(size, 4096);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 const size_t upper = (size + allow_waste > size) ? size + allow_waste : SIZE_MAX;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 if (before >= size && before <= upper) return;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 this->set_data_size(size);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 void audio_chunk::set_data(const audio_sample* src, size_t samples, spec_t const & spec, bool bQuicker) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 t_size size = samples * spec.chanCount;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 allocate(size, bQuicker);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 if (src)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 pfc::memcpy_t(get_data(), src, size);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 pfc::memset_t(get_data(), (audio_sample)0, size);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 set_sample_count(samples);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23 set_spec(spec);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 }
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 void audio_chunk::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
27 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 set_data(src, samples, makeSpec(srate, nch, channel_config));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 void audio_chunk::set_data(const audio_sample* src, size_t samples, unsigned nch, unsigned srate) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 set_data(src, samples, makeSpec(srate, nch));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 inline bool check_exclusive(unsigned val, unsigned mask)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 return (val&mask)!=0 && (val&mask)!=mask;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 static void _import8u(uint8_t const * in, audio_sample * out, size_t count) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 for(size_t walk = 0; walk < count; ++walk) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 uint32_t i = *(in++);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44 i -= 0x80; // to signed
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 *(out++) = (audio_sample) (int32_t) i / (float) 0x80;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 }
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 static void _import8s(uint8_t const * in, audio_sample * out, size_t count) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 for(size_t walk = 0; walk < count; ++walk) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 int32_t i = (int8_t) *(in++);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 *(out++) = (audio_sample) i / (float) 0x80;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 static audio_sample _import24s(uint32_t i) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57 i ^= 0x800000; // to unsigned
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 i -= 0x800000; // and back to signed / fill MSBs proper
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 return (audio_sample) (int32_t) i / (audio_sample) 0x800000;
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 static void _import24(const void * in_, audio_sample * out, size_t count) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 const uint8_t * in = (const uint8_t*) in_;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64 #if 1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65 while(count > 0 && !pfc::is_ptr_aligned_t<4>(in)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 uint32_t i = *(in++);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67 i |= (uint32_t) *(in++) << 8;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 i |= (uint32_t) *(in++) << 16;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69 *(out++) = _import24s(i);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70 --count;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73 for(size_t loop = count >> 2; loop; --loop) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74 uint32_t i1 = * (uint32_t*) in; in += 4;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75 uint32_t i2 = * (uint32_t*) in; in += 4;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76 uint32_t i3 = * (uint32_t*) in; in += 4;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77 *out++ = _import24s( i1 & 0xFFFFFF );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78 *out++ = _import24s( (i1 >> 24) | ((i2 & 0xFFFF) << 8) );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
79 *out++ = _import24s( (i2 >> 16) | ((i3 & 0xFF) << 16) );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80 *out++ = _import24s( i3 >> 8 );
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 count &= 3;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
83 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
84 for( ; count ; --count) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
85 uint32_t i = *(in++);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
86 i |= (uint32_t) *(in++) << 8;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
87 i |= (uint32_t) *(in++) << 16;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
88 *(out++) = _import24s(i);
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 #else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
91 if (count > 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
92 int32_t i = *(in++);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
93 i |= (int32_t) *(in++) << 8;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
94 i |= (int32_t) (int8_t) *in << 16;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
95 *out++ = (audio_sample) i / (audio_sample) 0x800000;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
96 --count;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
97
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
98 // Now we have in ptr at offset_of_next - 1 and we can read as int32 then discard the LSBs
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
99 for(;count;--count) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
100 int32_t i = *( int32_t*) in; in += 3;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
101 *out++ = (audio_sample) (i >> 8) / (audio_sample) 0x800000;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
102 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
103 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
104 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
105 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
106
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
107 template<bool byteSwap, bool isSigned> static void _import16any(const void * in, audio_sample * out, size_t count) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
108 uint16_t const * inPtr = (uint16_t const*) in;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
109 const audio_sample factor = 1.0f / (audio_sample) 0x8000;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
110 for(size_t walk = 0; walk < count; ++walk) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
111 uint16_t v = *inPtr++;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
112 if (byteSwap) v = pfc::byteswap_t(v);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
113 if (!isSigned) v ^= 0x8000; // to signed
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
114 *out++ = (audio_sample) (int16_t) v * factor;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
115 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
116 }
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 template<bool byteSwap, bool isSigned> static void _import32any(const void * in, audio_sample * out, size_t count) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
119 uint32_t const * inPtr = (uint32_t const*) in;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
120 const audio_sample factor = 1.0f / (audio_sample) 0x80000000ul;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
121 for(size_t walk = 0; walk < count; ++walk) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
122 uint32_t v = *inPtr++;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
123 if (byteSwap) v = pfc::byteswap_t(v);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
124 if (!isSigned) v ^= 0x80000000u; // to signed
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
125 *out++ = (audio_sample) (int32_t) v * factor;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
126 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
127 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
128
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
129 template<bool byteSwap, bool isSigned> static void _import24any(const void * in, audio_sample * out, size_t count) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
130 uint8_t const * inPtr = (uint8_t const*) in;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
131 const audio_sample factor = 1.0f / (audio_sample) 0x800000;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
132 for(size_t walk = 0; walk < count; ++walk) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
133 uint32_t v;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
134 if (byteSwap) v = (uint32_t) inPtr[2] | ( (uint32_t) inPtr[1] << 8 ) | ( (uint32_t) inPtr[0] << 16 );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
135 else v = (uint32_t) inPtr[0] | ( (uint32_t) inPtr[1] << 8 ) | ( (uint32_t) inPtr[2] << 16 );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
136 inPtr += 3;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
137 if (isSigned) v ^= 0x800000; // to unsigned
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
138 v -= 0x800000; // then subtract to get proper MSBs
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
139 *out++ = (audio_sample) (int32_t) v * factor;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
140 }
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
143 void audio_chunk::set_data_fixedpoint_ex(const void * source,t_size size,unsigned srate,unsigned nch,unsigned bps,unsigned flags,unsigned p_channel_config)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
144 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
145 PFC_ASSERT( check_exclusive(flags,FLAG_SIGNED|FLAG_UNSIGNED) );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
146 PFC_ASSERT( check_exclusive(flags,FLAG_LITTLE_ENDIAN|FLAG_BIG_ENDIAN) );
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 bool byteSwap = !!(flags & FLAG_BIG_ENDIAN);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
149 if (pfc::byte_order_is_big_endian) byteSwap = !byteSwap;
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 t_size count = size / (bps/8);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
152 set_data_size(count);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
153 audio_sample * buffer = get_data();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
154 bool isSigned = !!(flags & FLAG_SIGNED);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
155
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
156 switch(bps)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
157 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
158 case 8:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
159 // byte order irrelevant
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
160 if (isSigned) _import8s( (const uint8_t*) source , buffer, count);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
161 else _import8u( (const uint8_t*) source , buffer, count);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
162 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
163 case 16:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
164 if (byteSwap) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
165 if (isSigned) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
166 _import16any<true, true>( source, buffer, count );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
167 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
168 _import16any<true, false>( source, buffer, count );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
169 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
170 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
171 if (isSigned) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
172 //_import16any<false, true>( source, buffer, count );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
173 audio_math::convert_from_int16((const int16_t*)source,count,buffer,1.0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
174 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
175 _import16any<false, false>( source, buffer, count);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
176 }
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 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
179 case 24:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
180 if (byteSwap) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
181 if (isSigned) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
182 _import24any<true, true>( source, buffer, count );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
183 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
184 _import24any<true, false>( source, buffer, count );
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 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
187 if (isSigned) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
188 //_import24any<false, true>( source, buffer, count);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
189 _import24( source, buffer, count);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
190 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
191 _import24any<false, false>( source, buffer, count);
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 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
194 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
195 case 32:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
196 if (byteSwap) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
197 if (isSigned) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
198 _import32any<true, true>( source, buffer, count );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
199 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
200 _import32any<true, false>( source, buffer, count );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
201 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
202 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
203 if (isSigned) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
204 audio_math::convert_from_int32((const int32_t*)source,count,buffer,1.0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
205 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
206 _import32any<false, false>( source, buffer, count);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
207 }
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 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
210 default:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
211 //unknown size, cant convert
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
212 pfc::memset_t(buffer,(audio_sample)0,count);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
213 break;
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 set_sample_count(count/nch);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
216 set_srate(srate);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
217 set_channels(nch,p_channel_config);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
218 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
219
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
220 void audio_chunk::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
221 //set_data_fixedpoint_ex(ptr,bytes,sampleRate,channels,bps,(bps==8 ? FLAG_UNSIGNED : FLAG_SIGNED) | flags_autoendian(), channelConfig);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
222 PFC_ASSERT( bps != 0 );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
223 size_t count = bytes / (bps/8);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
224 this->set_data_size( count );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
225 audio_sample * buffer = this->get_data();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
226 switch(bps) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
227 case 8:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
228 _import8u((const uint8_t*)ptr, buffer, count);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
229 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
230 case 16:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
231 audio_math::convert_from_int16((const int16_t*) ptr, count, buffer, 1.0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
232 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
233 case 24:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
234 _import24( ptr, buffer, count);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
235 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
236 case 32:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
237 audio_math::convert_from_int32((const int32_t*) ptr, count, buffer, 1.0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
238 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
239 default:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
240 PFC_ASSERT(!"Unknown bit depth!");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
241 memset(buffer, 0, sizeof(audio_sample) * count);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
242 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
243 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
244 set_sample_count(count/channels);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
245 set_srate(sampleRate);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
246 set_channels(channels,channelConfig);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
247 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
248
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
249 void audio_chunk::set_data_fixedpoint_signed(const void * ptr,t_size bytes,unsigned sampleRate,unsigned channels,unsigned bps,unsigned channelConfig) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
250 PFC_ASSERT( bps != 0 );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
251 size_t count = bytes / (bps/8);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
252 this->set_data_size( count );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
253 audio_sample * buffer = this->get_data();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
254 switch(bps) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
255 case 8:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
256 _import8s((const uint8_t*)ptr, buffer, count);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
257 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
258 case 16:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
259 audio_math::convert_from_int16((const int16_t*) ptr, count, buffer, 1.0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
260 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
261 case 24:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
262 _import24( ptr, buffer, count);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
263 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
264 case 32:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
265 audio_math::convert_from_int32((const int32_t*) ptr, count, buffer, 1.0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
266 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
267 default:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
268 PFC_ASSERT(!"Unknown bit depth!");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
269 memset(buffer, 0, sizeof(audio_sample) * count);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
270 break;
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 set_sample_count(count/channels);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
273 set_srate(sampleRate);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
274 set_channels(channels,channelConfig);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
275 }
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 void audio_chunk::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
278 const size_t count = samples * nch;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
279 this->set_data_size( count );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
280 audio_sample * buffer = this->get_data();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
281 audio_math::convert_from_int16(src, count, buffer, 1.0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
282 set_sample_count(samples);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
283 set_srate(srate);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
284 set_channels(nch,channel_config);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
285 }
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 template<class t_float>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
288 static void process_float_multi(audio_sample * p_out,const t_float * p_in,const t_size p_count)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
289 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
290 audio_math::convert(p_in, p_out, p_count);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
291 }
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 template<class t_float>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
294 static void process_float_multi_swap(audio_sample * p_out,const t_float * p_in,const t_size p_count)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
295 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
296 for(size_t n=0;n<p_count;n++) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
297 p_out[n] = (audio_sample) pfc::byteswap_t(p_in[n]);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
298 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
299 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
300
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
301 void audio_chunk::set_data_32(const float* src, size_t samples, spec_t const& spec) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
302 #if audio_sample_size == 32
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
303 set_data(src, samples, spec);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
304 #else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
305 t_size size = samples * spec.chanCount;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
306 set_data_size(size);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
307 if (src)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
308 audio_math::convert(src, get_data(), size);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
309 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
310 pfc::memset_t(get_data(), (audio_sample)0, size);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
311 set_sample_count(samples);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
312 set_spec(spec);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
313 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
314 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
315 void audio_chunk::set_data_32(const float* src, size_t samples, unsigned nch, unsigned srate) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
316 set_data_32(src, samples, makeSpec(srate, nch) );
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 void audio_chunk::set_data_floatingpoint_ex(const void * ptr,t_size size,unsigned srate,unsigned nch,unsigned bps,unsigned flags,unsigned p_channel_config)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
320 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
321 PFC_ASSERT(is_supported_floatingpoint(bps));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
322 PFC_ASSERT( check_exclusive(flags,FLAG_LITTLE_ENDIAN|FLAG_BIG_ENDIAN) );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
323 PFC_ASSERT( ! (flags & (FLAG_SIGNED|FLAG_UNSIGNED) ) );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
324
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
325 bool use_swap = pfc::byte_order_is_big_endian ? !!(flags & FLAG_LITTLE_ENDIAN) : !!(flags & FLAG_BIG_ENDIAN);
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 const t_size count = size / (bps/8);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
328 set_data_size(count);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
329 audio_sample * out = get_data();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
330
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
331 if (bps == 32)
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 if (use_swap)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
334 process_float_multi_swap(out,reinterpret_cast<const float*>(ptr),count);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
335 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
336 process_float_multi(out,reinterpret_cast<const float*>(ptr),count);
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 else if (bps == 64)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
339 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
340 if (use_swap)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
341 process_float_multi_swap(out,reinterpret_cast<const double*>(ptr),count);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
342 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
343 process_float_multi(out,reinterpret_cast<const double*>(ptr),count);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
344 } else if (bps == 16) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
345 const uint16_t * in = reinterpret_cast<const uint16_t*>(ptr);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
346 if (use_swap) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
347 for(size_t walk = 0; walk < count; ++walk) out[walk] = audio_math::decodeFloat16(pfc::byteswap_t(in[walk]));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
348 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
349 for(size_t walk = 0; walk < count; ++walk) out[walk] = audio_math::decodeFloat16(in[walk]);
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 } else if (bps == 24) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
352 const uint8_t * in = reinterpret_cast<const uint8_t*>(ptr);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
353 if (use_swap) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
354 for(size_t walk = 0; walk < count; ++walk) out[walk] = audio_math::decodeFloat24ptrbs(&in[walk*3]);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
355 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
356 for(size_t walk = 0; walk < count; ++walk) out[walk] = audio_math::decodeFloat24ptr(&in[walk*3]);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
357 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
358 } else pfc::throw_exception_with_message< exception_io_data >("invalid bit depth");
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 set_sample_count(count/nch);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
361 set_srate(srate);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
362 set_channels(nch,p_channel_config);
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 pfc::string8 audio_chunk::formatChunkSpec() const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
366 pfc::string8 msg;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
367 msg << get_sample_rate() << " Hz, " << get_channels() << ":0x" << pfc::format_hex(get_channel_config(), 2) << " channels, " << get_sample_count() << " samples";
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
368 return msg;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
371 void audio_chunk::debugChunkSpec() const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
372 FB2K_DebugLog() << "Chunk: " << this->formatChunkSpec();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
373 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
374
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
375 #if PFC_DEBUG
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
376 void audio_chunk::assert_valid(const char * ctx) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
377 if (!is_valid()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
378 FB2K_DebugLog() << "audio_chunk::assert_valid failure in " << ctx;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
379 debugChunkSpec();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
380 uBugCheck();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
381 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
382 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
383 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
384 bool audio_chunk::is_valid() const
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 unsigned nch = get_channels();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
387 if (nch == 0 || nch > 32) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
388 if (!g_is_valid_sample_rate(get_srate())) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
389 t_size samples = get_sample_count();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
390 if (samples==0 || samples >= 0x80000000ul / (sizeof(audio_sample) * nch) ) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
391 t_size size = get_data_size();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
392 if (samples * nch > size) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
393 if (!get_data()) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
394 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
395 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
396
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
397 bool audio_chunk::is_spec_valid() const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
398 return this->get_spec().is_valid();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
399 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
400
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
401 void audio_chunk::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
402 if (is_empty())
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
403 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
404 if (hint_srate && hint_nch) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
405 return set_data(0,samples,hint_nch,hint_srate);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
406 } else throw exception_io_data();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
407 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
408 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
409 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
410 if (hint_srate && hint_srate != get_srate()) samples = MulDiv_Size(samples,get_srate(),hint_srate);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
411 if (samples > get_sample_count())
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
412 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
413 t_size old_size = get_sample_count() * get_channels();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
414 t_size new_size = samples * get_channels();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
415 set_data_size(new_size);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
416 pfc::memset_t(get_data() + old_size,(audio_sample)0,new_size - old_size);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
417 set_sample_count(samples);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
418 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
419 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
420 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
421
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
422 void audio_chunk::pad_with_silence(t_size samples) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
423 if (samples > get_sample_count())
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
424 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
425 t_size old_size = get_sample_count() * get_channels();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
426 t_size new_size = pfc::multiply_guarded(samples,(size_t)get_channels());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
427 set_data_size(new_size);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
428 pfc::memset_t(get_data() + old_size,(audio_sample)0,new_size - old_size);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
429 set_sample_count(samples);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
430 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
431 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
432
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
433 void audio_chunk::set_silence(t_size samples) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
434 t_size items = samples * get_channels();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
435 set_data_size(items);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
436 pfc::memset_null_t(get_data(), items);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
437 set_sample_count(samples);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
438 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
439
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
440 void audio_chunk::set_silence_seconds( double seconds ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
441 set_silence( (size_t) audio_math::time_to_samples( seconds, this->get_sample_rate() ) );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
442 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
443
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
444 void audio_chunk::insert_silence_fromstart(t_size samples) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
445 t_size old_size = get_sample_count() * get_channels();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
446 t_size delta = samples * get_channels();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
447 t_size new_size = old_size + delta;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
448 set_data_size(new_size);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
449 audio_sample * ptr = get_data();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
450 pfc::memmove_t(ptr+delta,ptr,old_size);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
451 pfc::memset_t(ptr,(audio_sample)0,delta);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
452 set_sample_count(get_sample_count() + samples);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
453 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
454
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
455 bool audio_chunk::process_skip(double & skipDuration) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
456 t_uint64 skipSamples = audio_math::time_to_samples(skipDuration, get_sample_rate());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
457 if (skipSamples == 0) {skipDuration = 0; return true;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
458 const t_size mySamples = get_sample_count();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
459 if (skipSamples < mySamples) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
460 skip_first_samples((t_size)skipSamples);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
461 skipDuration = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
462 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
463 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
464 if (skipSamples == mySamples) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
465 skipDuration = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
466 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
467 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
468 skipDuration -= audio_math::samples_to_time(mySamples, get_sample_rate());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
469 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
470 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
471
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
472 t_size audio_chunk::skip_first_samples(t_size samples_delta)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
473 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
474 t_size samples_old = get_sample_count();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
475 if (samples_delta >= samples_old)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
476 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
477 set_sample_count(0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
478 set_data_size(0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
479 return samples_old;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
480 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
481 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
482 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
483 t_size samples_new = samples_old - samples_delta;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
484 unsigned nch = get_channels();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
485 audio_sample * ptr = get_data();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
486 pfc::memmove_t(ptr,ptr+nch*samples_delta,nch*samples_new);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
487 set_sample_count(samples_new);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
488 set_data_size(nch*samples_new);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
489 return samples_delta;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
490 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
491 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
492
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
493 audio_sample audio_chunk::get_peak(audio_sample p_peak) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
494 return pfc::max_t(p_peak, get_peak());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
495 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
496
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
497 audio_sample audio_chunk::get_peak() const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
498 return audio_math::calculate_peak(get_data(),get_sample_count() * get_channels());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
499 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
500
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
501 void audio_chunk::scale(audio_sample p_value)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
502 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
503 audio_sample * ptr = get_data();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
504 audio_math::scale(ptr,get_sample_count() * get_channels(),ptr,p_value);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
505 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
506
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
507
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
508 namespace {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
509
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
510 struct sampleToIntDesc {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
511 unsigned bps, bpsValid;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
512 bool useUpperBits;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
513 audio_sample scale;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
514 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
515 template<typename int_t> class sampleToInt {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
516 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
517 sampleToInt(sampleToIntDesc const & d) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
518 clipLo = - ( (int_t) 1 << (d.bpsValid-1));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
519 clipHi = ( (int_t) 1 << (d.bpsValid-1)) - 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
520 scale = (float) ( (int64_t) 1 << (d.bpsValid - 1) ) * d.scale;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
521 if (d.useUpperBits) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
522 shift = (int8_t)( d.bps - d.bpsValid );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
523 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
524 shift = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
525 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
526 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
527 inline int_t operator() (audio_sample s) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
528 int_t v;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
529 if constexpr (sizeof(int_t) > 4) v = (int_t) audio_math::rint64( s * scale );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
530 else v = (int_t)audio_math::rint32( s * scale );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
531 return pfc::clip_t<int_t>( v, clipLo, clipHi) << shift;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
532 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
533 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
534 int_t clipLo, clipHi;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
535 int8_t shift;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
536 audio_sample scale;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
537 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
538 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
539 static void render_24bit(const audio_sample * in, t_size inLen, void * out, sampleToIntDesc const & d) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
540 t_uint8 * outWalk = reinterpret_cast<t_uint8*>(out);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
541 sampleToInt<int32_t> gen(d);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
542 for(t_size walk = 0; walk < inLen; ++walk) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
543 int32_t v = gen(in[walk]);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
544 *(outWalk ++) = (t_uint8) (v & 0xFF);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
545 *(outWalk ++) = (t_uint8) ((v >> 8) & 0xFF);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
546 *(outWalk ++) = (t_uint8) ((v >> 16) & 0xFF);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
547 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
548 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
549 static void render_8bit(const audio_sample * in, t_size inLen, void * out, sampleToIntDesc const & d) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
550 sampleToInt<int32_t> gen(d);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
551 t_int8 * outWalk = reinterpret_cast<t_int8*>(out);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
552 for(t_size walk = 0; walk < inLen; ++walk) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
553 *outWalk++ = (t_int8)gen(in[walk]);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
554 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
555 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
556 static void render_16bit(const audio_sample * in, t_size inLen, void * out, sampleToIntDesc const & d) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
557 sampleToInt<int32_t> gen(d);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
558 int16_t * outWalk = reinterpret_cast<int16_t*>(out);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
559 for(t_size walk = 0; walk < inLen; ++walk) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
560 *outWalk++ = (int16_t)gen(in[walk]);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
561 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
562 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
563
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
564 template<typename internal_t>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
565 static void render_32bit_(const audio_sample * in, t_size inLen, void * out, sampleToIntDesc const & d) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
566 sampleToInt<internal_t> gen(d); // must use int64 for clipping
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
567 int32_t * outWalk = reinterpret_cast<int32_t*>(out);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
568 for(t_size walk = 0; walk < inLen; ++walk) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
569 *outWalk++ = (int32_t)gen(in[walk]);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
570 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
571 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
572
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
573 bool audio_chunk::g_toFixedPoint(const audio_sample * in, void * out, size_t count, uint32_t bps, uint32_t bpsValid, bool useUpperBits, audio_sample scale) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
574 const sampleToIntDesc d = {bps, bpsValid, useUpperBits, scale};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
575 if (bps == 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
576 PFC_ASSERT(!"How did we get here?");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
577 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
578 } else if (bps <= 8) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
579 render_8bit(in, count, out, d);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
580 } else if (bps <= 16) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
581 render_16bit(in, count, out, d);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
582 } else if (bps <= 24) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
583 render_24bit(in, count, out, d);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
584 } else if (bps <= 32) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
585 if (bpsValid <= 28) { // for speed
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
586 render_32bit_<int32_t>(in, count, out, d);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
587 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
588 render_32bit_<int64_t>(in, count, out, d);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
589 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
590 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
591 PFC_ASSERT(!"How did we get here?");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
592 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
593 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
594
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
595 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
596 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
597
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
598 bool audio_chunk::toFixedPoint(class mem_block_container & out, uint32_t bps, uint32_t bpsValid, bool useUpperBits, audio_sample scale) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
599 bps = (bps + 7) & ~7;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
600 if (bps < bpsValid) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
601 const size_t count = get_sample_count() * get_channel_count();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
602 out.set_size( count * (bps/8) );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
603 return g_toFixedPoint(get_data(), out.get_ptr(), count, bps, bpsValid, useUpperBits, scale);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
604 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
605
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
606 bool audio_chunk::to_raw_data(mem_block_container & out, t_uint32 bps, bool useUpperBits, audio_sample scale) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
607 uint32_t bpsValid = bps;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
608 bps = (bps + 7) & ~7;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
609 const size_t count = get_sample_count() * get_channel_count();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
610 out.set_size( count * (bps/8) );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
611 void * outPtr = out.get_ptr();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
612 audio_sample const * inPtr = get_data();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
613 if (bps == 32) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
614 float * f = (float*) outPtr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
615 audio_math::convert(inPtr, f, count, scale);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
616 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
617 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
618 return g_toFixedPoint(inPtr, outPtr, count, bps, bpsValid, useUpperBits, scale);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
619 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
620 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
621
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
622 audio_chunk::spec_t audio_chunk::makeSpec(uint32_t rate, uint32_t channels) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
623 return makeSpec( rate, channels, g_guess_channel_config(channels) );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
624 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
625
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
626 audio_chunk::spec_t audio_chunk::makeSpec(uint32_t rate, uint32_t channels, uint32_t mask) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
627 PFC_ASSERT(mask == 0 || pfc::countBits32(mask) == channels);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
628 spec_t spec = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
629 spec.sampleRate = rate; spec.chanCount = channels; spec.chanMask = mask;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
630 return spec;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
631 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
632
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
633 bool audio_chunk::spec_t::equals( const spec_t & v1, const spec_t & v2 ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
634 return v1.sampleRate == v2.sampleRate && v1.chanCount == v2.chanCount && v1.chanMask == v2.chanMask;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
635 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
636
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
637 pfc::string8 audio_chunk::spec_t::toString(const char * delim) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
638 pfc::string_formatter temp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
639 if ( sampleRate > 0 ) temp << sampleRate << "Hz";
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
640 if (chanCount > 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
641 if ( temp.length() > 0 ) temp << delim;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
642 temp << chanCount << "ch";
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
643 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
644
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
645 if ( chanMask != audio_chunk::channel_config_mono && chanMask != audio_chunk::channel_config_stereo ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
646 pfc::string8 strMask;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
647 audio_chunk::g_formatChannelMaskDesc( chanMask, strMask );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
648 if ( temp.length() > 0) temp << delim;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
649 temp << strMask;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
650 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
651 return temp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
652 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
653
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
654 audio_chunk::spec_t audio_chunk::get_spec() const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
655 spec_t spec = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
656 spec.sampleRate = this->get_sample_rate();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
657 spec.chanCount = this->get_channel_count();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
658 spec.chanMask = this->get_channel_config();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
659 return spec;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
660 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
661 void audio_chunk::set_spec(const spec_t & spec) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
662 set_sample_rate(spec.sampleRate);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
663 set_channels( spec.chanCount, spec.chanMask );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
664 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
665
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
666 bool audio_chunk::spec_t::is_valid() const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
667 if (this->chanCount==0 || this->chanCount>256) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
668 if (!audio_chunk::g_is_valid_sample_rate(this->sampleRate)) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
669 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
670 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
671
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
672 #ifdef _WIN32
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
673
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
674 WAVEFORMATEX audio_chunk::spec_t::toWFX() const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
675 const uint32_t sampleWidth = sizeof(audio_sample);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
676
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
677 WAVEFORMATEX wfx = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
678 wfx.wFormatTag = WAVE_FORMAT_IEEE_FLOAT;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
679 wfx.nChannels = (WORD) chanCount;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
680 wfx.nSamplesPerSec = sampleRate;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
681 wfx.nAvgBytesPerSec = sampleRate * chanCount * sampleWidth;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
682 wfx.nBlockAlign = (WORD)( chanCount * sampleWidth );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
683 wfx.wBitsPerSample = sampleWidth * 8;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
684 return wfx;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
685 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
686
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
687 WAVEFORMATEXTENSIBLE audio_chunk::spec_t::toWFXEX() const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
688 const uint32_t sampleWidth = sizeof(audio_sample);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
689 const bool isFloat = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
690
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
691 WAVEFORMATEXTENSIBLE wfxe;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
692 wfxe.Format = toWFX();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
693 wfxe.Format.wFormatTag = WAVE_FORMAT_EXTENSIBLE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
694 wfxe.Format.cbSize = sizeof(wfxe) - sizeof(wfxe.Format);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
695 wfxe.Samples.wValidBitsPerSample = sampleWidth * 8;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
696 wfxe.dwChannelMask = audio_chunk::g_channel_config_to_wfx(this->chanMask);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
697 wfxe.SubFormat = isFloat ? KSDATAFORMAT_SUBTYPE_IEEE_FLOAT : KSDATAFORMAT_SUBTYPE_PCM;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
698
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
699 return wfxe;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
700 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
701
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
702 WAVEFORMATEX audio_chunk::spec_t::toWFXWithBPS(uint32_t bps) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
703 const uint32_t sampleWidth = (bps+7)/8;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
704
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
705 WAVEFORMATEX wfx = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
706 wfx.wFormatTag = WAVE_FORMAT_PCM;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
707 wfx.nChannels = (WORD)chanCount;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
708 wfx.nSamplesPerSec = sampleRate;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
709 wfx.nAvgBytesPerSec = sampleRate * chanCount * sampleWidth;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
710 wfx.nBlockAlign = (WORD)( chanCount * sampleWidth );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
711 wfx.wBitsPerSample = (WORD)( sampleWidth * 8 );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
712 return wfx;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
713 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
714
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
715 WAVEFORMATEXTENSIBLE audio_chunk::spec_t::toWFXEXWithBPS(uint32_t bps) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
716 const uint32_t sampleWidth = (bps + 7) / 8;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
717 const bool isFloat = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
718
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
719 WAVEFORMATEXTENSIBLE wfxe;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
720 wfxe.Format = toWFXWithBPS(bps);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
721 wfxe.Format.wFormatTag = WAVE_FORMAT_EXTENSIBLE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
722 wfxe.Format.cbSize = sizeof(wfxe) - sizeof(wfxe.Format);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
723 wfxe.Samples.wValidBitsPerSample = (WORD)( sampleWidth * 8 );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
724 wfxe.dwChannelMask = audio_chunk::g_channel_config_to_wfx(this->chanMask);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
725 wfxe.SubFormat = isFloat ? KSDATAFORMAT_SUBTYPE_IEEE_FLOAT : KSDATAFORMAT_SUBTYPE_PCM;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
726
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
727 return wfxe;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
728 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
729 #endif // _WIN32
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
730
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
731 void audio_chunk::append(const audio_chunk& other) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
732 if (other.get_spec() != this->get_spec()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
733 throw pfc::exception_invalid_params();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
734 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
735
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
736 this->grow_data_size(get_used_size() + other.get_used_size());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
737 audio_sample* p = this->get_data() + get_used_size();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
738 memcpy(p, other.get_data(), other.get_used_size() * sizeof(audio_sample));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
739 set_sample_count(get_sample_count() + other.get_sample_count());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
740 }