164{
166
168
169 outTracks.clear();
170
172 *trackFactory,
176
177
178 const size_t SAMPLES_TO_READ = (*trackList->Any<
WaveTrack>().
begin())->GetMaxBlockSize();
179 uint32_t totalSamplesRead = 0;
180
181 {
182 const uint32_t bufferSize =
mNumChannels * SAMPLES_TO_READ;
186 uint32_t samplesRead = 0;
187
189 int16Buffer.
reinit(bufferSize);
191 floatBuffer.
reinit(bufferSize);
192 }
193
194 do {
195 samplesRead = WavpackUnpackSamples(
mWavPackContext, wavpackBuffer.get(), SAMPLES_TO_READ);
196
199 for (int64_t c = 0; c < samplesRead *
mNumChannels; c++)
200 int16Buffer[c] = static_cast<int16_t>(wavpackBuffer[c] * 256);
201 else
202 for (int64_t c = 0; c < samplesRead *
mNumChannels; c++)
203 int16Buffer[c] = static_cast<int16_t>(wavpackBuffer[c]);
204
205 unsigned chn = 0;
207 {
208 channel.AppendBuffer(
211 samplesRead,
214 );
215 ++chn;
216 });
218 unsigned chn = 0;
220 {
221 channel.AppendBuffer(
224 samplesRead,
227 );
228 ++chn;
229 });
230 } else {
231 for (int64_t c = 0; c < samplesRead *
mNumChannels; c++)
232 floatBuffer[c] = static_cast<float>(wavpackBuffer[c] / static_cast<double>(std::numeric_limits<int32_t>::max()));
233
234 unsigned chn = 0;
236 {
237 channel.AppendBuffer(
240 samplesRead,
243 );
244 ++chn;
245 });
246 }
247
248 totalSamplesRead += samplesRead;
249
252 }
253
257
259 {
261 return;
262 }
263
265 {
267 return;
268 }
269
271
272 if (wavpackMode & MODE_VALID_TAG) {
273 bool apeTag = wavpackMode & MODE_APETAG;
275
276 if (numItems > 0) {
278 for (int i = 0; i < numItems; i++) {
279 int itemLen = 0, valueLen = 0;
280 wxString value,
name;
281
282
284 std::string item (itemLen + 1, '\0');
285 WavpackGetTagItemIndexed(
mWavPackContext, i, item.data(), itemLen + 1);
286 item.resize(itemLen);
288
289
291 std::string itemValue (valueLen + 1, '\0');
292 WavpackGetTagItem(
mWavPackContext, item.data(), itemValue.data(), valueLen + 1);
293 itemValue.resize(valueLen);
294
295 if (apeTag) {
296 for (int j = 0; j < valueLen; j++) {
297
298 if (!itemValue[j]) {
299 itemValue[j] = '\n';
300 }
301 }
302 }
304
306 long val;
307 if (value.length() == 4 && value.ToLong(&val)) {
309 }
310 }
311
313 }
314 }
315 }
316
320}
const TranslatableString name
This simplifies arrays of arrays, each array separately allocated with NEW[] But it might be better t...
void reinit(Integral count, bool initialize=false)
bool IsStopped() const noexcept
bool IsCancelled() const noexcept
virtual void OnImportResult(ImportResult result)=0
Used to report on import result for file handle passed as argument to OnImportFileOpened.
virtual void OnImportProgress(double progress)=0
static void ShowMessageBox(const TranslatableString &message, const TranslatableString &caption=XO("Import Project"))
static TrackListHolder NewWaveTrack(WaveTrackFactory &trackFactory, unsigned nChannels, sampleFormat effectiveFormat, double rate)
static void ForEachChannel(TrackList &trackList, const std::function< void(WaveChannel &)> &op)
Iterates over channels in each wave track from the list.
static void FinalizeImport(TrackHolders &outTracks, const std::vector< TrackListHolder > &importedStreams)
Flushes the given channels and moves them to outTracks.
A Track that contains audio waveform data.
auto begin(const Ptr< Type, BaseDeleter > &p)
Enables range-for.
wxString ToWXString(const std::string &str)