163{
165
167
168 outTracks.clear();
169
171 *trackFactory,
175
176
177 const size_t SAMPLES_TO_READ = (*trackList->Any<
WaveTrack>().
begin())->GetMaxBlockSize();
178 uint32_t totalSamplesRead = 0;
179
180 {
181 const uint32_t bufferSize =
mNumChannels * SAMPLES_TO_READ;
185 uint32_t samplesRead = 0;
186
188 int16Buffer.
reinit(bufferSize);
190 floatBuffer.
reinit(bufferSize);
191 }
192
193 do {
194 samplesRead = WavpackUnpackSamples(
mWavPackContext, wavpackBuffer.get(), SAMPLES_TO_READ);
195
198 for (int64_t c = 0; c < samplesRead *
mNumChannels; c++)
199 int16Buffer[c] = static_cast<int16_t>(wavpackBuffer[c] * 256);
200 else
201 for (int64_t c = 0; c < samplesRead *
mNumChannels; c++)
202 int16Buffer[c] = static_cast<int16_t>(wavpackBuffer[c]);
203
204 unsigned chn = 0;
206 {
207 channel.AppendBuffer(
210 samplesRead,
213 );
214 ++chn;
215 });
217 unsigned chn = 0;
219 {
220 channel.AppendBuffer(
223 samplesRead,
226 );
227 ++chn;
228 });
229 } else {
230 for (int64_t c = 0; c < samplesRead *
mNumChannels; c++)
231 floatBuffer[c] = static_cast<float>(wavpackBuffer[c] / static_cast<double>(std::numeric_limits<int32_t>::max()));
232
233 unsigned chn = 0;
235 {
236 channel.AppendBuffer(
239 samplesRead,
242 );
243 ++chn;
244 });
245 }
246
247 totalSamplesRead += samplesRead;
248
251 }
252
256
258 {
260 return;
261 }
262
264 {
266 return;
267 }
268
270
271 if (wavpackMode & MODE_VALID_TAG) {
272 bool apeTag = wavpackMode & MODE_APETAG;
274
275 if (numItems > 0) {
277 for (int i = 0; i < numItems; i++) {
278 int itemLen = 0, valueLen = 0;
279 wxString value,
name;
280
281
283 std::string item (itemLen + 1, '\0');
284 WavpackGetTagItemIndexed(
mWavPackContext, i, item.data(), itemLen + 1);
285 item.resize(itemLen);
287
288
290 std::string itemValue (valueLen + 1, '\0');
291 WavpackGetTagItem(
mWavPackContext, item.data(), itemValue.data(), valueLen + 1);
292 itemValue.resize(valueLen);
293
294 if (apeTag) {
295 for (int j = 0; j < valueLen; j++) {
296
297 if (!itemValue[j]) {
298 itemValue[j] = '\n';
299 }
300 }
301 }
303
305 long val;
306 if (value.length() == 4 && value.ToLong(&val)) {
308 }
309 }
310
312 }
313 }
314 }
315
319}
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)