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

Public Member Functions

 Exporter (LockedBlock block)
 
 ~Exporter ()
 
std::vector< uint8_t > Compress ()
 
void Feed (int32_t *data, int32_t count)
 
void Flush ()
 

Static Public Member Functions

static int WriteBlock (void *id, void *data, int32_t length)
 

Public Attributes

WavpackContext * Context { nullptr }
 
LockedBlock Block
 
std::vector< uint8_t > CompressedData
 

Detailed Description

Definition at line 31 of file WavPackCompressor.cpp.

Constructor & Destructor Documentation

◆ Exporter()

audacity::cloud::audiocom::sync::anonymous_namespace{WavPackCompressor.cpp}::Exporter::Exporter ( LockedBlock  block)
inline

Definition at line 37 of file WavPackCompressor.cpp.

38 : Block { std::move(block) }
39 {
40 WavpackConfig config = {};
41
42 config.num_channels = 1;
43 config.channel_mask = 0x4;
44 // Sample rate is irrelevant, so just set it to something
45 config.sample_rate = 48000;
46
47 config.bytes_per_sample = SAMPLE_SIZE_DISK(Block.Format);
48 config.bits_per_sample = config.bytes_per_sample * 8;
49 config.float_norm_exp = Block.Format == floatSample ? 127 : 0;
50
51 config.flags = CONFIG_FAST_FLAG;
52
53 Context = WavpackOpenFileOutput(WriteBlock, this, nullptr);
54
55 if (
56 !WavpackSetConfiguration(
57 Context, &config, Block.Block->GetSampleCount()) ||
58 !WavpackPackInit(Context))
59 {
60 WavpackCloseFile(Context);
61 Context = nullptr;
62 }
63 }
constexpr sampleFormat floatSample
Definition: SampleFormat.h:45
#define SAMPLE_SIZE_DISK(SampleFormat)
Return the size on disk of one uncompressed sample (bytes)
Definition: SampleFormat.h:67

References audacity::cloud::audiocom::sync::LockedBlock::Block, floatSample, audacity::cloud::audiocom::sync::LockedBlock::Format, and SAMPLE_SIZE_DISK.

◆ ~Exporter()

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

Definition at line 65 of file WavPackCompressor.cpp.

66 {
67 if (Context != nullptr)
68 WavpackCloseFile(Context);
69 }

Member Function Documentation

◆ Compress()

std::vector< uint8_t > audacity::cloud::audiocom::sync::anonymous_namespace{WavPackCompressor.cpp}::Exporter::Compress ( )
inline

Definition at line 71 of file WavPackCompressor.cpp.

72 {
73 const auto sampleFormat = Block.Format;
74 const auto sampleCount = Block.Block->GetSampleCount();
75 const auto dataSize = sampleCount * SAMPLE_SIZE(sampleFormat);
76
77 std::vector<std::remove_pointer_t<samplePtr>> sampleData;
78 sampleData.resize(dataSize);
79
80 const size_t samplesRead = Block.Block->GetSamples(
81 sampleData.data(), Block.Format, 0, sampleCount, false);
82
83 // Reserve 1.5 times the size of the original data
84 // The compressed data will be smaller than the original data,
85 // but we overallocate just in case
86 CompressedData.reserve(sampleData.size() * 3 / 2);
87
88 if (sampleFormat == int16Sample)
89 {
90 constexpr size_t conversionSamplesCount = 4096;
91
92 const int16_t* int16Data = reinterpret_cast<const int16_t*>(sampleData.data());
93 std::vector<int32_t> buffer;
94 buffer.resize(conversionSamplesCount);
95
96 for (size_t firstSample = 0; firstSample < samplesRead;
97 firstSample += conversionSamplesCount)
98 {
99 const auto samplesThisRun =
100 std::min(conversionSamplesCount, samplesRead - firstSample);
101
102 for (size_t i = 0; i < samplesThisRun; ++i)
103 buffer[i] =
104 (static_cast<int32_t>(int16Data[firstSample + i]) * 65536) >>
105 16;
106
107 WavpackPackSamples(Context, buffer.data(), samplesThisRun);
108 }
109 }
110 else
111 {
112 const void* data = sampleData.data();
113 WavpackPackSamples(
114 Context, static_cast<int32_t*>(const_cast<void*>(data)),
115 samplesRead);
116 }
117
118 Flush();
119
120 return std::move(CompressedData);
121 }
int min(int a, int b)
sampleFormat
The ordering of these values with operator < agrees with the order of increasing bit width.
Definition: SampleFormat.h:30
#define SAMPLE_SIZE(SampleFormat)
Definition: SampleFormat.h:52
Positions or offsets within audio files need a wide type.
Definition: SampleCount.h:19

References audacity::cloud::audiocom::sync::LockedBlock::Block, audacity::cloud::audiocom::sync::LockedBlock::Format, int16Sample, min(), and SAMPLE_SIZE.

Here is the call graph for this function:

◆ Feed()

void audacity::cloud::audiocom::sync::anonymous_namespace{WavPackCompressor.cpp}::Exporter::Feed ( int32_t *  data,
int32_t  count 
)
inline

Definition at line 123 of file WavPackCompressor.cpp.

124 {
125 if (Context == nullptr)
126 return;
127
128 WavpackPackSamples(Context, data, count);
129 }

◆ Flush()

void audacity::cloud::audiocom::sync::anonymous_namespace{WavPackCompressor.cpp}::Exporter::Flush ( )
inline

Definition at line 131 of file WavPackCompressor.cpp.

132 {
133 if (Context == nullptr)
134 return;
135
136 WavpackFlushSamples(Context);
137
138 const std::string formatString = std::to_string(unsigned(Block.Format));
139 WavpackAppendTagItem(
140 Context, "FORMAT", formatString.data(), formatString.size());
141
142 const std::string blockIdString = std::to_string(Block.Id);
143 WavpackAppendTagItem(
144 Context, "BLOCK_ID", blockIdString.data(), blockIdString.size());
145
146 WavpackAppendTagItem(
147 Context, "HASH", Block.Hash.data(), Block.Hash.size());
148
149 WavpackWriteTag(Context);
150 WavpackCloseFile(Context);
151
152 Context = nullptr;
153 }

References audacity::cloud::audiocom::sync::LockedBlock::Format, audacity::cloud::audiocom::sync::LockedBlock::Hash, and audacity::cloud::audiocom::sync::LockedBlock::Id.

◆ WriteBlock()

static int audacity::cloud::audiocom::sync::anonymous_namespace{WavPackCompressor.cpp}::Exporter::WriteBlock ( void *  id,
void *  data,
int32_t  length 
)
inlinestatic

Definition at line 155 of file WavPackCompressor.cpp.

156 {
157 if (id == nullptr || data == nullptr || length == 0)
158 return true;
159
160 Exporter* exporter = static_cast<Exporter*>(id);
161
162 auto start = reinterpret_cast<uint8_t*>(data);
163 auto end = start + length;
164
165 exporter->CompressedData.insert(
166 exporter->CompressedData.end(), start, end);
167
168 return true;
169 }
int id
const char * end(const char *str) noexcept
Definition: StringUtils.h:106

References CompressedData, details::end(), and id.

Here is the call graph for this function:

Member Data Documentation

◆ Block

LockedBlock audacity::cloud::audiocom::sync::anonymous_namespace{WavPackCompressor.cpp}::Exporter::Block

Definition at line 34 of file WavPackCompressor.cpp.

◆ CompressedData

std::vector<uint8_t> audacity::cloud::audiocom::sync::anonymous_namespace{WavPackCompressor.cpp}::Exporter::CompressedData

Definition at line 35 of file WavPackCompressor.cpp.

Referenced by WriteBlock().

◆ Context

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

Definition at line 33 of file WavPackCompressor.cpp.


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