Audacity 3.2.0
Public Member Functions | Public Attributes | Static Private Member Functions | Private Attributes | List of all members
audacity::cloud::audiocom::sync::anonymous_namespace{WavPackCompressor.cpp}::Importer Struct Referencefinal
Collaboration diagram for audacity::cloud::audiocom::sync::anonymous_namespace{WavPackCompressor.cpp}::Importer:
[legend]

Public Member Functions

bool IsValid () const
 
 Importer (const void *data, const int64_t size)
 
std::string ReadTag (const char *tagName)
 
 ~Importer ()
 
bool Unpack ()
 

Public Attributes

WavpackContext * Context { nullptr }
 
const void * Data { nullptr }
 
const int64_t Size { Offset }
 
int64_t Offset { 0 }
 
int Mode {}
 
uint32_t SamplesCount {}
 
uint8_t UngetcChar { 0 }
 
bool UngetcFlag { false }
 
sampleFormat Format { undefinedSample }
 
int64_t BlockId { -1 }
 
std::vector< int32_t > Int32Buffer
 
std::vector< int16_t > Int16Buffer
 
std::vector< float > FloatBuffer
 

Static Private Member Functions

static int32_t raw_read_bytes (void *id, void *data, int32_t bcount)
 
static int32_t raw_write_bytes (void *id, void *data, int32_t bcount)
 
static int64_t raw_get_pos (void *id)
 
static int raw_set_pos_abs (void *id, int64_t pos)
 
static int raw_set_pos_rel (void *id, int64_t delta, int mode)
 
static int raw_push_back_byte (void *id, int c)
 
static int64_t raw_get_length (void *id)
 
static int raw_can_seek (void *)
 
static int raw_close_stream (void *)
 

Private Attributes

WavpackStreamReader64 raw_reader
 

Detailed Description

Definition at line 172 of file WavPackCompressor.cpp.

Constructor & Destructor Documentation

◆ Importer()

audacity::cloud::audiocom::sync::anonymous_namespace{WavPackCompressor.cpp}::Importer::Importer ( const void *  data,
const int64_t  size 
)
inline

Definition at line 204 of file WavPackCompressor.cpp.

205 : Data { data }
206 , Size { size }
207 {
208 if (Data == nullptr || Size == 0)
209 return;
210
211 char error[81];
212
213 Context = WavpackOpenFileInputEx64(
214 &raw_reader, this, nullptr, error, OPEN_DSD_AS_PCM | OPEN_TAGS, 0);
215
216 if (Context == nullptr)
217 return;
218
219 Mode = WavpackGetMode(Context);
220 SamplesCount = WavpackGetNumSamples(Context);
221
222 const auto formatString = ReadTag("FORMAT");
223 unsigned format {};
224 auto result = FromChars(
225 formatString.c_str(), formatString.c_str() + formatString.size(),
226 format);
227 if (result.ec == std::errc {})
228 Format = static_cast<sampleFormat>(format);
229
230 auto blockIdString = ReadTag("BLOCK_ID");
231 FromChars(
232 blockIdString.c_str(), blockIdString.c_str() + blockIdString.size(),
233 BlockId);
234 }
FromCharsResult FromChars(const char *buffer, const char *last, float &value) noexcept
Parse a string into a single precision floating point value, always uses the dot as decimal.
Definition: FromChars.cpp:153
sampleFormat
The ordering of these values with operator < agrees with the order of increasing bit width.
Definition: SampleFormat.h:30
Abstract base class used in importing a file.

References anonymous_namespace{ExportPCM.cpp}::format, and FromChars().

Here is the call graph for this function:

◆ ~Importer()

audacity::cloud::audiocom::sync::anonymous_namespace{WavPackCompressor.cpp}::Importer::~Importer ( )
inline

Definition at line 255 of file WavPackCompressor.cpp.

256 {
257 if (Context != nullptr)
258 WavpackCloseFile(Context);
259 }

Member Function Documentation

◆ IsValid()

bool audacity::cloud::audiocom::sync::anonymous_namespace{WavPackCompressor.cpp}::Importer::IsValid ( ) const
inline

Definition at line 198 of file WavPackCompressor.cpp.

199 {
200 return Context != nullptr && SamplesCount > 0 &&
201 Format != undefinedSample && BlockId >= 0;
202 }
constexpr sampleFormat undefinedSample
Definition: SampleFormat.h:42

References undefinedSample.

◆ raw_can_seek()

static int audacity::cloud::audiocom::sync::anonymous_namespace{WavPackCompressor.cpp}::Importer::raw_can_seek ( void *  )
inlinestaticprivate

Definition at line 403 of file WavPackCompressor.cpp.

404 {
405 return 1;
406 }

◆ raw_close_stream()

static int audacity::cloud::audiocom::sync::anonymous_namespace{WavPackCompressor.cpp}::Importer::raw_close_stream ( void *  )
inlinestaticprivate

Definition at line 408 of file WavPackCompressor.cpp.

409 {
410 return 0;
411 }

◆ raw_get_length()

static int64_t audacity::cloud::audiocom::sync::anonymous_namespace{WavPackCompressor.cpp}::Importer::raw_get_length ( void *  id)
inlinestaticprivate

Definition at line 398 of file WavPackCompressor.cpp.

399 {
400 return static_cast<Importer*>(id)->Size;
401 }
int id
Singleton class which actually imports the audio, using ImportPlugin objects that are registered by m...
Definition: Import.h:84

References id.

◆ raw_get_pos()

static int64_t audacity::cloud::audiocom::sync::anonymous_namespace{WavPackCompressor.cpp}::Importer::raw_get_pos ( void *  id)
inlinestaticprivate

Definition at line 345 of file WavPackCompressor.cpp.

References id.

◆ raw_push_back_byte()

static int audacity::cloud::audiocom::sync::anonymous_namespace{WavPackCompressor.cpp}::Importer::raw_push_back_byte ( void *  id,
int  c 
)
inlinestaticprivate

Definition at line 388 of file WavPackCompressor.cpp.

389 {
390 Importer* importer = static_cast<Importer*>(id);
391
392 importer->UngetcChar = c;
393 importer->UngetcFlag = true;
394
395 return c;
396 }

References id, UngetcChar, and UngetcFlag.

◆ raw_read_bytes()

static int32_t audacity::cloud::audiocom::sync::anonymous_namespace{WavPackCompressor.cpp}::Importer::raw_read_bytes ( void *  id,
void *  data,
int32_t  bcount 
)
inlinestaticprivate

Definition at line 313 of file WavPackCompressor.cpp.

314 {
315 Importer* importer = static_cast<Importer*>(id);
316 uint8_t* outptr = static_cast<uint8_t*>(data);
317
318 if (importer->UngetcFlag)
319 {
320 *outptr++ = importer->UngetcChar;
321 importer->UngetcFlag = false;
322 bcount--;
323 }
324
325 const auto bytesToCopy =
326 std::min<int32_t>(bcount, importer->Size - importer->Offset);
327
328 std::memcpy(
329 outptr, static_cast<const uint8_t*>(importer->Data) + importer->Offset,
330 bytesToCopy);
331
332 outptr += bytesToCopy;
333 bcount -= bytesToCopy;
334
335 importer->Offset += bytesToCopy;
336
337 return static_cast<int32_t>(outptr - static_cast<uint8_t*>(data));
338 }

References Data, id, Offset, Size, UngetcChar, and UngetcFlag.

◆ raw_set_pos_abs()

static int audacity::cloud::audiocom::sync::anonymous_namespace{WavPackCompressor.cpp}::Importer::raw_set_pos_abs ( void *  id,
int64_t  pos 
)
inlinestaticprivate

Definition at line 350 of file WavPackCompressor.cpp.

351 {
352 return raw_set_pos_rel(id, pos, SEEK_SET);
353 }

◆ raw_set_pos_rel()

static int audacity::cloud::audiocom::sync::anonymous_namespace{WavPackCompressor.cpp}::Importer::raw_set_pos_rel ( void *  id,
int64_t  delta,
int  mode 
)
inlinestaticprivate

Definition at line 355 of file WavPackCompressor.cpp.

356 {
357 Importer* importer = static_cast<Importer*>(id);
358
359 switch (mode)
360 {
361 case SEEK_SET:
362 {
363 if (delta < 0 || delta > importer->Size)
364 return 1;
365 importer->Offset = delta;
366 break;
367 }
368 case SEEK_CUR:
369 {
370 const auto newOffset = delta + importer->Offset;
371 if (newOffset < 0 || newOffset > importer->Size)
372 return 1;
373 importer->Offset += delta;
374 break;
375 }
376 case SEEK_END:
377 {
378 if (delta > 0 || -delta > importer->Size)
379 return 1;
380 importer->Offset = importer->Size + delta;
381 break;
382 }
383 }
384
385 return 0;
386 }

References id, Offset, and Size.

◆ raw_write_bytes()

static int32_t audacity::cloud::audiocom::sync::anonymous_namespace{WavPackCompressor.cpp}::Importer::raw_write_bytes ( void *  id,
void *  data,
int32_t  bcount 
)
inlinestaticprivate

Definition at line 340 of file WavPackCompressor.cpp.

341 {
342 return 0;
343 }

◆ ReadTag()

std::string audacity::cloud::audiocom::sync::anonymous_namespace{WavPackCompressor.cpp}::Importer::ReadTag ( const char *  tagName)
inline

Definition at line 236 of file WavPackCompressor.cpp.

237 {
238 if (Context == nullptr)
239 return {};
240
241 const auto tagLength = WavpackGetTagItem(Context, tagName, nullptr, 0);
242
243 std::string tag;
244
245 if (tagLength > 0)
246 {
247 tag.resize(tagLength + 1);
248 WavpackGetTagItem(Context, tagName, tag.data(), tagLength + 1);
249 tag.resize(tagLength);
250 }
251
252 return tag;
253 }

◆ Unpack()

bool audacity::cloud::audiocom::sync::anonymous_namespace{WavPackCompressor.cpp}::Importer::Unpack ( )
inline

Definition at line 261 of file WavPackCompressor.cpp.

262 {
263 if (!IsValid())
264 return false;
265
267
268 if (Format == int16Sample)
270 else if (Format == floatSample)
272
273 const auto samplesRead =
274 WavpackUnpackSamples(Context, Int32Buffer.data(), SamplesCount);
275
276 if (samplesRead != SamplesCount)
277 return false;
278
279 const bool floatSamples = (Mode & MODE_FLOAT) == MODE_FLOAT;
280
281 if (floatSamples)
282 {
284 std::memcpy(
285 FloatBuffer.data(), Int32Buffer.data(),
286 SamplesCount * sizeof(float));
287 }
288 else if (Format == int16Sample)
289 {
290 const auto bytesPerSample = WavpackGetBytesPerSample(Context);
291
292 if (bytesPerSample == 1)
293 {
294 for (size_t i = 0; i < SamplesCount; ++i)
295 Int16Buffer[i] = static_cast<int16_t>(Int32Buffer[i]) << 8;
296 }
297 else if (bytesPerSample == 2)
298 {
299 for (size_t i = 0; i < SamplesCount; ++i)
300 Int16Buffer[i] = static_cast<int16_t>(Int32Buffer[i]);
301 }
302 else
303 {
304 assert(false);
305 return false;
306 }
307 }
308
309 return true;
310 }

References floatSample, and int16Sample.

Member Data Documentation

◆ BlockId

int64_t audacity::cloud::audiocom::sync::anonymous_namespace{WavPackCompressor.cpp}::Importer::BlockId { -1 }

Definition at line 191 of file WavPackCompressor.cpp.

◆ Context

WavpackContext* audacity::cloud::audiocom::sync::anonymous_namespace{WavPackCompressor.cpp}::Importer::Context { nullptr }

Definition at line 174 of file WavPackCompressor.cpp.

◆ Data

const void* audacity::cloud::audiocom::sync::anonymous_namespace{WavPackCompressor.cpp}::Importer::Data { nullptr }

Definition at line 177 of file WavPackCompressor.cpp.

Referenced by raw_read_bytes().

◆ FloatBuffer

std::vector<float> audacity::cloud::audiocom::sync::anonymous_namespace{WavPackCompressor.cpp}::Importer::FloatBuffer

Definition at line 196 of file WavPackCompressor.cpp.

◆ Format

sampleFormat audacity::cloud::audiocom::sync::anonymous_namespace{WavPackCompressor.cpp}::Importer::Format { undefinedSample }

Definition at line 190 of file WavPackCompressor.cpp.

◆ Int16Buffer

std::vector<int16_t> audacity::cloud::audiocom::sync::anonymous_namespace{WavPackCompressor.cpp}::Importer::Int16Buffer

Definition at line 195 of file WavPackCompressor.cpp.

◆ Int32Buffer

std::vector<int32_t> audacity::cloud::audiocom::sync::anonymous_namespace{WavPackCompressor.cpp}::Importer::Int32Buffer

Definition at line 194 of file WavPackCompressor.cpp.

◆ Mode

int audacity::cloud::audiocom::sync::anonymous_namespace{WavPackCompressor.cpp}::Importer::Mode {}

Definition at line 182 of file WavPackCompressor.cpp.

◆ Offset

int64_t audacity::cloud::audiocom::sync::anonymous_namespace{WavPackCompressor.cpp}::Importer::Offset { 0 }

Definition at line 180 of file WavPackCompressor.cpp.

Referenced by raw_read_bytes(), and raw_set_pos_rel().

◆ raw_reader

WavpackStreamReader64 audacity::cloud::audiocom::sync::anonymous_namespace{WavPackCompressor.cpp}::Importer::raw_reader
private
Initial value:
nullptr, raw_close_stream }

Definition at line 413 of file WavPackCompressor.cpp.

◆ SamplesCount

uint32_t audacity::cloud::audiocom::sync::anonymous_namespace{WavPackCompressor.cpp}::Importer::SamplesCount {}

Definition at line 183 of file WavPackCompressor.cpp.

◆ Size

const int64_t audacity::cloud::audiocom::sync::anonymous_namespace{WavPackCompressor.cpp}::Importer::Size { Offset }

Definition at line 178 of file WavPackCompressor.cpp.

Referenced by raw_read_bytes(), and raw_set_pos_rel().

◆ UngetcChar

uint8_t audacity::cloud::audiocom::sync::anonymous_namespace{WavPackCompressor.cpp}::Importer::UngetcChar { 0 }

Definition at line 185 of file WavPackCompressor.cpp.

Referenced by raw_push_back_byte(), and raw_read_bytes().

◆ UngetcFlag

bool audacity::cloud::audiocom::sync::anonymous_namespace{WavPackCompressor.cpp}::Importer::UngetcFlag { false }

Definition at line 186 of file WavPackCompressor.cpp.

Referenced by raw_push_back_byte(), and raw_read_bytes().


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