Audacity 3.2.0
Public Member Functions | Private Attributes | List of all members
WavPackImportFileHandle Class Referencefinal

An ImportFileHandle for WavPack data. More...

Inheritance diagram for WavPackImportFileHandle:
[legend]
Collaboration diagram for WavPackImportFileHandle:
[legend]

Public Member Functions

 WavPackImportFileHandle (const FilePath &filename, WavpackContext *wavpackContext)
 
 ~WavPackImportFileHandle ()
 
TranslatableString GetFileDescription () override
 
ByteCount GetFileUncompressedBytes () override
 
void Import (ImportProgressListener &progressListener, WaveTrackFactory *trackFactory, TrackHolders &outTracks, Tags *tags, std::optional< LibFileFormats::AcidizerTags > &outAcidTags) override
 
wxInt32 GetStreamCount () override
 
const TranslatableStringsGetStreamInfo () override
 
void SetStreamUsage (wxInt32 StreamID, bool Use) override
 
- Public Member Functions inherited from ImportFileHandleEx
 ImportFileHandleEx (const FilePath &filename)
 
FilePath GetFilename () const override
 
void Cancel () override
 
void Stop () override
 
- Public Member Functions inherited from ImportFileHandle
virtual ~ImportFileHandle ()
 
virtual FilePath GetFilename () const =0
 
virtual TranslatableString GetErrorMessage () const
 
virtual TranslatableString GetFileDescription ()=0
 
virtual ByteCount GetFileUncompressedBytes ()=0
 
virtual wxInt32 GetStreamCount ()=0
 
virtual const TranslatableStringsGetStreamInfo ()=0
 
virtual void SetStreamUsage (wxInt32 StreamID, bool Use)=0
 
virtual void Import (ImportProgressListener &progressListener, WaveTrackFactory *trackFactory, TrackHolders &outTracks, Tags *tags, std::optional< LibFileFormats::AcidizerTags > &acidTags)=0
 
virtual void Cancel ()=0
 
virtual void Stop ()=0
 

Private Attributes

WavpackContext * mWavPackContext
 
int mNumChannels
 
uint32_t mSampleRate
 
int mBitsPerSample
 
int mBytesPerSample
 
int64_t mNumSamples
 
sampleFormat mFormat
 

Additional Inherited Members

- Public Types inherited from ImportFileHandle
using ByteCount = unsigned long long
 
- Protected Member Functions inherited from ImportFileHandleEx
void BeginImport ()
 
bool IsCancelled () const noexcept
 
bool IsStopped () const noexcept
 

Detailed Description

An ImportFileHandle for WavPack data.

Definition at line 55 of file ImportWavPack.cpp.

Constructor & Destructor Documentation

◆ WavPackImportFileHandle()

WavPackImportFileHandle::WavPackImportFileHandle ( const FilePath filename,
WavpackContext *  wavpackContext 
)

Definition at line 131 of file ImportWavPack.cpp.

133: ImportFileHandleEx(filename),
134 mWavPackContext(wavpackContext),
135 mNumChannels(WavpackGetNumChannels(mWavPackContext)),
136 mSampleRate(WavpackGetSampleRate(mWavPackContext)),
137 mBitsPerSample(WavpackGetBitsPerSample(mWavPackContext)),
138 mBytesPerSample(WavpackGetBytesPerSample(mWavPackContext)),
139 mNumSamples(WavpackGetNumSamples64(mWavPackContext))
140{
141 if (mBitsPerSample <= 16) {
143 } else if (mBitsPerSample <= 24) {
145 } else {
147 }
148}
ImportFileHandleEx(const FilePath &filename)
WavpackContext * mWavPackContext

References floatSample, int16Sample, int24Sample, mBitsPerSample, and mFormat.

◆ ~WavPackImportFileHandle()

WavPackImportFileHandle::~WavPackImportFileHandle ( )

Definition at line 335 of file ImportWavPack.cpp.

336{
337 WavpackCloseFile(mWavPackContext);
338}

References mWavPackContext.

Member Function Documentation

◆ GetFileDescription()

TranslatableString WavPackImportFileHandle::GetFileDescription ( )
overridevirtual

Implements ImportFileHandle.

Definition at line 150 of file ImportWavPack.cpp.

151{
152 return DESC;
153}
#define DESC

References DESC.

◆ GetFileUncompressedBytes()

auto WavPackImportFileHandle::GetFileUncompressedBytes ( )
overridevirtual

Implements ImportFileHandle.

Definition at line 155 of file ImportWavPack.cpp.

156{
157 return 0;
158}

◆ GetStreamCount()

wxInt32 WavPackImportFileHandle::GetStreamCount ( )
overridevirtual

Implements ImportFileHandle.

Definition at line 320 of file ImportWavPack.cpp.

321{
322 return 1;
323}

◆ GetStreamInfo()

const TranslatableStrings & WavPackImportFileHandle::GetStreamInfo ( )
overridevirtual

Implements ImportFileHandle.

Definition at line 325 of file ImportWavPack.cpp.

326{
327 static TranslatableStrings empty;
328 return empty;
329}
std::vector< TranslatableString > TranslatableStrings

◆ Import()

void WavPackImportFileHandle::Import ( ImportProgressListener progressListener,
WaveTrackFactory trackFactory,
TrackHolders outTracks,
Tags tags,
std::optional< LibFileFormats::AcidizerTags > &  outAcidTags 
)
overridevirtual

Implements ImportFileHandle.

Definition at line 160 of file ImportWavPack.cpp.

164{
165 BeginImport();
166
167 const int wavpackMode = WavpackGetMode(mWavPackContext);
168
169 outTracks.clear();
170
171 auto tracks = trackFactory->CreateMany(mNumChannels, mFormat, mSampleRate);
172
173
174 /* The number of samples to read in each loop */
175 const size_t SAMPLES_TO_READ = (*tracks->Any<WaveTrack>().begin())->GetMaxBlockSize();
176 uint32_t totalSamplesRead = 0;
177
178 {
179 const uint32_t bufferSize = mNumChannels * SAMPLES_TO_READ;
180 ArrayOf<int32_t> wavpackBuffer{ bufferSize };
181 ArrayOf<int16_t> int16Buffer;
182 ArrayOf<float> floatBuffer;
183 uint32_t samplesRead = 0;
184
185 if (mFormat == int16Sample) {
186 int16Buffer.reinit(bufferSize);
187 } else if (mFormat == floatSample && (wavpackMode & MODE_FLOAT) != MODE_FLOAT) {
188 floatBuffer.reinit(bufferSize);
189 }
190
191 do {
192 samplesRead = WavpackUnpackSamples(mWavPackContext, wavpackBuffer.get(), SAMPLES_TO_READ);
193
194 if (mFormat == int16Sample) {
195 if (mBytesPerSample == 1)
196 for (int64_t c = 0; c < samplesRead * mNumChannels; c++)
197 int16Buffer[c] = static_cast<int16_t>(wavpackBuffer[c] * 256);
198 else
199 for (int64_t c = 0; c < samplesRead * mNumChannels; c++)
200 int16Buffer[c] = static_cast<int16_t>(wavpackBuffer[c]);
201
202 unsigned chn = 0;
203 ImportUtils::ForEachChannel(*tracks, [&](auto& channel)
204 {
205 channel.AppendBuffer(
206 reinterpret_cast<constSamplePtr>(int16Buffer.get() + chn),
207 mFormat,
208 samplesRead,
210 mFormat
211 );
212 ++chn;
213 });
214 } else if (mFormat == int24Sample || (wavpackMode & MODE_FLOAT) == MODE_FLOAT) {
215 unsigned chn = 0;
216 ImportUtils::ForEachChannel(*tracks, [&](auto& channel)
217 {
218 channel.AppendBuffer(
219 reinterpret_cast<constSamplePtr>(wavpackBuffer.get() + chn),
220 mFormat,
221 samplesRead,
223 mFormat
224 );
225 ++chn;
226 });
227 } else {
228 for (int64_t c = 0; c < samplesRead * mNumChannels; c++)
229 floatBuffer[c] = static_cast<float>(wavpackBuffer[c] / static_cast<double>(std::numeric_limits<int32_t>::max()));
230
231 unsigned chn = 0;
232 ImportUtils::ForEachChannel(*tracks, [&](auto& channel)
233 {
234 channel.AppendBuffer(
235 reinterpret_cast<constSamplePtr>(floatBuffer.get() + chn),
236 mFormat,
237 samplesRead,
239 mFormat
240 );
241 ++chn;
242 });
243 }
244
245 totalSamplesRead += samplesRead;
246
247 progressListener.OnImportProgress(WavpackGetProgress(mWavPackContext));
248 } while (!IsCancelled() && !IsStopped() && samplesRead != 0);
249 }
250
251 if (WavpackGetNumErrors(mWavPackContext))
253 XO( "Encountered %d errors decoding WavPack file!" ).Format( WavpackGetNumErrors(mWavPackContext) ));
254
255 if(IsCancelled())
256 {
258 return;
259 }
260
261 if (totalSamplesRead < mNumSamples && !IsStopped())
262 {
264 return;
265 }
266
267
268 ImportUtils::FinalizeImport(outTracks, std::move(*tracks));
269
270 if (wavpackMode & MODE_VALID_TAG) {
271 bool apeTag = wavpackMode & MODE_APETAG;
272 int numItems = WavpackGetNumTagItems(mWavPackContext);
273
274 if (numItems > 0) {
275 tags->Clear();
276 for (int i = 0; i < numItems; i++) {
277 int itemLen = 0, valueLen = 0;
278 wxString value, name;
279
280 // Get the actual length of the item key at this index i
281 itemLen = WavpackGetTagItemIndexed(mWavPackContext, i, NULL, 0);
282 std::string item (itemLen + 1, '\0');
283 WavpackGetTagItemIndexed(mWavPackContext, i, item.data(), itemLen + 1);
284 item.resize(itemLen); // remove terminating NULL from std::string
286
287 // Get the actual length of the value for this item key
288 valueLen = WavpackGetTagItem(mWavPackContext, item.data(), NULL, 0);
289 std::string itemValue (valueLen + 1, '\0');
290 WavpackGetTagItem(mWavPackContext, item.data(), itemValue.data(), valueLen + 1);
291 itemValue.resize(valueLen); // remove terminating NULL from std::string
292
293 if (apeTag) {
294 for (int j = 0; j < valueLen; j++) {
295 // APEv2 text tags can have multiple NULL separated string values
296 if (!itemValue[j]) {
297 itemValue[j] = '\n';
298 }
299 }
300 }
301 value = audacity::ToWXString(itemValue);
302
303 if (name.Upper() == wxT("DATE") && !tags->HasTag(TAG_YEAR)) {
304 long val;
305 if (value.length() == 4 && value.ToLong(&val)) {
306 name = TAG_YEAR;
307 }
308 }
309
310 tags->SetTag(name, value);
311 }
312 }
313 }
314
315 progressListener.OnImportResult(IsStopped()
318}
wxT("CloseDown"))
XO("Cut/Copy/Paste")
const char * constSamplePtr
Definition: SampleFormat.h:58
#define TAG_YEAR
Definition: Tags.h:62
wxString name
Definition: TagsEditor.cpp:166
const auto tracks
This simplifies arrays of arrays, each array separately allocated with NEW[] But it might be better t...
Definition: MemoryX.h:29
void reinit(Integral count, bool initialize=false)
Definition: MemoryX.h:59
Abstract base class used in importing a file.
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"))
Definition: ImportUtils.cpp:43
static void ForEachChannel(TrackList &trackList, const std::function< void(WaveChannel &)> &op)
Iterates over channels in each wave track from the list.
Definition: ImportUtils.cpp:73
static void FinalizeImport(TrackHolders &outTracks, const std::vector< std::shared_ptr< WaveTrack > > &importedStreams)
Flushes the given channels and moves them to outTracks.
Definition: ImportUtils.cpp:49
void Clear()
Definition: Tags.cpp:293
bool HasTag(const wxString &name) const
Definition: Tags.cpp:397
void SetTag(const wxString &name, const wxString &value, const bool bSpecialTag=false)
Definition: Tags.cpp:431
TrackListHolder CreateMany(size_t nChannels)
Creates tracks with project's default rate and format and the given number of channels.
Definition: WaveTrack.cpp:423
A Track that contains audio waveform data.
Definition: WaveTrack.h:203
wxString ToWXString(const std::string &str)
const char * begin(const char *str) noexcept
Definition: StringUtils.h:101

References details::begin(), ImportFileHandleEx::BeginImport(), ImportProgressListener::Cancelled, Tags::Clear(), WaveTrackFactory::CreateMany(), ImportProgressListener::Error, ImportUtils::FinalizeImport(), floatSample, ImportUtils::ForEachChannel(), Tags::HasTag(), int16Sample, int24Sample, ImportFileHandleEx::IsCancelled(), ImportFileHandleEx::IsStopped(), mBytesPerSample, mFormat, mNumChannels, mNumSamples, mSampleRate, mWavPackContext, name, ImportProgressListener::OnImportProgress(), ImportProgressListener::OnImportResult(), ArrayOf< X >::reinit(), Tags::SetTag(), ImportUtils::ShowMessageBox(), ImportProgressListener::Stopped, ImportProgressListener::Success, TAG_YEAR, audacity::ToWXString(), tracks, wxT(), and XO().

Here is the call graph for this function:

◆ SetStreamUsage()

void WavPackImportFileHandle::SetStreamUsage ( wxInt32  StreamID,
bool  Use 
)
overridevirtual

Implements ImportFileHandle.

Definition at line 331 of file ImportWavPack.cpp.

332{
333}

Member Data Documentation

◆ mBitsPerSample

int WavPackImportFileHandle::mBitsPerSample
private

Definition at line 77 of file ImportWavPack.cpp.

Referenced by WavPackImportFileHandle().

◆ mBytesPerSample

int WavPackImportFileHandle::mBytesPerSample
private

Definition at line 78 of file ImportWavPack.cpp.

Referenced by Import().

◆ mFormat

sampleFormat WavPackImportFileHandle::mFormat
private

Definition at line 80 of file ImportWavPack.cpp.

Referenced by Import(), and WavPackImportFileHandle().

◆ mNumChannels

int WavPackImportFileHandle::mNumChannels
private

Definition at line 75 of file ImportWavPack.cpp.

Referenced by Import().

◆ mNumSamples

int64_t WavPackImportFileHandle::mNumSamples
private

Definition at line 79 of file ImportWavPack.cpp.

Referenced by Import().

◆ mSampleRate

uint32_t WavPackImportFileHandle::mSampleRate
private

Definition at line 76 of file ImportWavPack.cpp.

Referenced by Import().

◆ mWavPackContext

WavpackContext* WavPackImportFileHandle::mWavPackContext
private

Definition at line 74 of file ImportWavPack.cpp.

Referenced by Import(), and ~WavPackImportFileHandle().


The documentation for this class was generated from the following file: