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) 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)=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 130 of file ImportWavPack.cpp.

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

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

◆ ~WavPackImportFileHandle()

WavPackImportFileHandle::~WavPackImportFileHandle ( )

Definition at line 336 of file ImportWavPack.cpp.

337{
338 WavpackCloseFile(mWavPackContext);
339}

References mWavPackContext.

Member Function Documentation

◆ GetFileDescription()

TranslatableString WavPackImportFileHandle::GetFileDescription ( )
overridevirtual

Implements ImportFileHandle.

Definition at line 149 of file ImportWavPack.cpp.

150{
151 return DESC;
152}
#define DESC

References DESC.

◆ GetFileUncompressedBytes()

auto WavPackImportFileHandle::GetFileUncompressedBytes ( )
overridevirtual

Implements ImportFileHandle.

Definition at line 154 of file ImportWavPack.cpp.

155{
156 return 0;
157}

◆ GetStreamCount()

wxInt32 WavPackImportFileHandle::GetStreamCount ( )
overridevirtual

Implements ImportFileHandle.

Definition at line 321 of file ImportWavPack.cpp.

322{
323 return 1;
324}

◆ GetStreamInfo()

const TranslatableStrings & WavPackImportFileHandle::GetStreamInfo ( )
overridevirtual

Implements ImportFileHandle.

Definition at line 326 of file ImportWavPack.cpp.

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

◆ Import()

void WavPackImportFileHandle::Import ( ImportProgressListener progressListener,
WaveTrackFactory trackFactory,
TrackHolders outTracks,
Tags tags 
)
overridevirtual

Implements ImportFileHandle.

Definition at line 159 of file ImportWavPack.cpp.

163{
164 BeginImport();
165
166 const int wavpackMode = WavpackGetMode(mWavPackContext);
167
168 outTracks.clear();
169
170 auto trackList = ImportUtils::NewWaveTrack(
171 *trackFactory,
173 mFormat,
175
176 /* The number of samples to read in each loop */
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;
182 ArrayOf<int32_t> wavpackBuffer{ bufferSize };
183 ArrayOf<int16_t> int16Buffer;
184 ArrayOf<float> floatBuffer;
185 uint32_t samplesRead = 0;
186
187 if (mFormat == int16Sample) {
188 int16Buffer.reinit(bufferSize);
189 } else if (mFormat == floatSample && (wavpackMode & MODE_FLOAT) != MODE_FLOAT) {
190 floatBuffer.reinit(bufferSize);
191 }
192
193 do {
194 samplesRead = WavpackUnpackSamples(mWavPackContext, wavpackBuffer.get(), SAMPLES_TO_READ);
195
196 if (mFormat == int16Sample) {
197 if (mBytesPerSample == 1)
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;
205 ImportUtils::ForEachChannel(*trackList, [&](auto& channel)
206 {
207 channel.AppendBuffer(
208 reinterpret_cast<constSamplePtr>(int16Buffer.get() + chn),
209 mFormat,
210 samplesRead,
212 mFormat
213 );
214 ++chn;
215 });
216 } else if (mFormat == int24Sample || (wavpackMode & MODE_FLOAT) == MODE_FLOAT) {
217 unsigned chn = 0;
218 ImportUtils::ForEachChannel(*trackList, [&](auto& channel)
219 {
220 channel.AppendBuffer(
221 reinterpret_cast<constSamplePtr>(wavpackBuffer.get() + chn),
222 mFormat,
223 samplesRead,
225 mFormat
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;
234 ImportUtils::ForEachChannel(*trackList, [&](auto& channel)
235 {
236 channel.AppendBuffer(
237 reinterpret_cast<constSamplePtr>(floatBuffer.get() + chn),
238 mFormat,
239 samplesRead,
241 mFormat
242 );
243 ++chn;
244 });
245 }
246
247 totalSamplesRead += samplesRead;
248
249 progressListener.OnImportProgress(WavpackGetProgress(mWavPackContext));
250 } while (!IsCancelled() && !IsStopped() && samplesRead != 0);
251 }
252
253 if (WavpackGetNumErrors(mWavPackContext))
255 XO( "Encountered %d errors decoding WavPack file!" ).Format( WavpackGetNumErrors(mWavPackContext) ));
256
257 if(IsCancelled())
258 {
260 return;
261 }
262
263 if (totalSamplesRead < mNumSamples && !IsStopped())
264 {
266 return;
267 }
268
269 ImportUtils::FinalizeImport(outTracks, trackList);
270
271 if (wavpackMode & MODE_VALID_TAG) {
272 bool apeTag = wavpackMode & MODE_APETAG;
273 int numItems = WavpackGetNumTagItems(mWavPackContext);
274
275 if (numItems > 0) {
276 tags->Clear();
277 for (int i = 0; i < numItems; i++) {
278 int itemLen = 0, valueLen = 0;
279 wxString value, name;
280
281 // Get the actual length of the item key at this index i
282 itemLen = WavpackGetTagItemIndexed(mWavPackContext, i, NULL, 0);
283 std::string item (itemLen + 1, '\0');
284 WavpackGetTagItemIndexed(mWavPackContext, i, item.data(), itemLen + 1);
285 item.resize(itemLen); // remove terminating NULL from std::string
287
288 // Get the actual length of the value for this item key
289 valueLen = WavpackGetTagItem(mWavPackContext, item.data(), NULL, 0);
290 std::string itemValue (valueLen + 1, '\0');
291 WavpackGetTagItem(mWavPackContext, item.data(), itemValue.data(), valueLen + 1);
292 itemValue.resize(valueLen); // remove terminating NULL from std::string
293
294 if (apeTag) {
295 for (int j = 0; j < valueLen; j++) {
296 // APEv2 text tags can have multiple NULL separated string values
297 if (!itemValue[j]) {
298 itemValue[j] = '\n';
299 }
300 }
301 }
302 value = audacity::ToWXString(itemValue);
303
304 if (name.Upper() == wxT("DATE") && !tags->HasTag(TAG_YEAR)) {
305 long val;
306 if (value.length() == 4 && value.ToLong(&val)) {
307 name = TAG_YEAR;
308 }
309 }
310
311 tags->SetTag(name, value);
312 }
313 }
314 }
315
316 progressListener.OnImportResult(IsStopped()
319}
wxT("CloseDown"))
const TranslatableString name
Definition: Distortion.cpp:76
XO("Cut/Copy/Paste")
const char * constSamplePtr
Definition: SampleFormat.h:56
#define TAG_YEAR
Definition: Tags.h:62
This simplifies arrays of arrays, each array separately allocated with NEW[] But it might be better t...
Definition: MemoryX.h:27
void reinit(Integral count, bool initialize=false)
Definition: MemoryX.h:57
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 TrackListHolder NewWaveTrack(WaveTrackFactory &trackFactory, unsigned nChannels, sampleFormat effectiveFormat, double rate)
Definition: ImportUtils.cpp:35
static void ForEachChannel(TrackList &trackList, const std::function< void(WaveChannel &)> &op)
Iterates over channels in each wave track from the list.
Definition: ImportUtils.cpp:66
static void FinalizeImport(TrackHolders &outTracks, const std::vector< TrackListHolder > &importedStreams)
Flushes the given channels and moves them to outTracks.
Definition: ImportUtils.cpp:49
void Clear()
Definition: Tags.cpp:298
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
A Track that contains audio waveform data.
Definition: WaveTrack.h:220
auto begin(const Ptr< Type, BaseDeleter > &p)
Enables range-for.
Definition: PackedArray.h:150
wxString ToWXString(const std::string &str)

References PackedArray::begin(), ImportFileHandleEx::BeginImport(), ImportProgressListener::Cancelled, Tags::Clear(), ImportProgressListener::Error, ImportUtils::FinalizeImport(), floatSample, ImportUtils::ForEachChannel(), Tags::HasTag(), int16Sample, int24Sample, ImportFileHandleEx::IsCancelled(), ImportFileHandleEx::IsStopped(), mBytesPerSample, mFormat, mNumChannels, mNumSamples, mSampleRate, mWavPackContext, name, ImportUtils::NewWaveTrack(), ImportProgressListener::OnImportProgress(), ImportProgressListener::OnImportResult(), ArrayOf< X >::reinit(), Tags::SetTag(), ImportUtils::ShowMessageBox(), ImportProgressListener::Stopped, ImportProgressListener::Success, TAG_YEAR, audacity::ToWXString(), 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 332 of file ImportWavPack.cpp.

333{
334}

Member Data Documentation

◆ mBitsPerSample

int WavPackImportFileHandle::mBitsPerSample
private

Definition at line 76 of file ImportWavPack.cpp.

Referenced by WavPackImportFileHandle().

◆ mBytesPerSample

int WavPackImportFileHandle::mBytesPerSample
private

Definition at line 77 of file ImportWavPack.cpp.

Referenced by Import().

◆ mFormat

sampleFormat WavPackImportFileHandle::mFormat
private

Definition at line 79 of file ImportWavPack.cpp.

Referenced by Import(), and WavPackImportFileHandle().

◆ mNumChannels

int WavPackImportFileHandle::mNumChannels
private

Definition at line 74 of file ImportWavPack.cpp.

Referenced by Import().

◆ mNumSamples

int64_t WavPackImportFileHandle::mNumSamples
private

Definition at line 78 of file ImportWavPack.cpp.

Referenced by Import().

◆ mSampleRate

uint32_t WavPackImportFileHandle::mSampleRate
private

Definition at line 75 of file ImportWavPack.cpp.

Referenced by Import().

◆ mWavPackContext

WavpackContext* WavPackImportFileHandle::mWavPackContext
private

Definition at line 73 of file ImportWavPack.cpp.

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


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