29#include<wavpack/wavpack.h>
37#define DESC XO("WavPack files")
51 std::unique_ptr<ImportFileHandle>
Open(
97 return wxT(
"libwavpack");
107 char errMessage[100];
108 int flags = OPEN_WVC | OPEN_FILE_UTF8 | OPEN_TAGS | OPEN_DSD_AS_PCM | OPEN_NORMALIZE;
109 WavpackContext *wavpackContext = WavpackOpenFileInput(filename, errMessage, flags, 0);
111 if (!wavpackContext) {
113 wxLogDebug(
"WavpackOpenFileInput() failed on file %s, error = %s", filename, errMessage);
117 auto handle = std::make_unique<WavPackImportFileHandle>(filename, wavpackContext);
119 return std::move(handle);
123 std::make_unique< WavPackImportPlugin >()
131 WavpackContext *wavpackContext)
133 mWavPackContext(wavpackContext),
134 mNumChannels(WavpackGetNumChannels(mWavPackContext)),
135 mSampleRate(WavpackGetSampleRate(mWavPackContext)),
136 mBitsPerSample(WavpackGetBitsPerSample(mWavPackContext)),
137 mBytesPerSample(WavpackGetBytesPerSample(mWavPackContext)),
138 mNumSamples(WavpackGetNumSamples64(mWavPackContext))
177 const size_t SAMPLES_TO_READ = (*trackList->Any<
WaveTrack>().
begin())->GetMaxBlockSize();
178 uint32_t totalSamplesRead = 0;
181 const uint32_t bufferSize =
mNumChannels * SAMPLES_TO_READ;
185 uint32_t samplesRead = 0;
188 int16Buffer.
reinit(bufferSize);
190 floatBuffer.
reinit(bufferSize);
194 samplesRead = WavpackUnpackSamples(
mWavPackContext, wavpackBuffer.get(), SAMPLES_TO_READ);
198 for (int64_t c = 0; c < samplesRead *
mNumChannels; c++)
199 int16Buffer[c] =
static_cast<int16_t
>(wavpackBuffer[c] * 256);
201 for (int64_t c = 0; c < samplesRead *
mNumChannels; c++)
202 int16Buffer[c] =
static_cast<int16_t
>(wavpackBuffer[c]);
207 channel.AppendBuffer(
220 channel.AppendBuffer(
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()));
236 channel.AppendBuffer(
247 totalSamplesRead += samplesRead;
271 if (wavpackMode & MODE_VALID_TAG) {
272 bool apeTag = wavpackMode & MODE_APETAG;
277 for (
int i = 0; i < numItems; i++) {
278 int itemLen = 0, valueLen = 0;
279 wxString value,
name;
283 std::string item (itemLen + 1,
'\0');
284 WavpackGetTagItemIndexed(
mWavPackContext, i, item.data(), itemLen + 1);
285 item.resize(itemLen);
290 std::string itemValue (valueLen + 1,
'\0');
291 WavpackGetTagItem(
mWavPackContext, item.data(), itemValue.data(), valueLen + 1);
292 itemValue.resize(valueLen);
295 for (
int j = 0; j < valueLen; j++) {
306 if (value.length() == 4 && value.ToLong(&val)) {
Declare functions to perform UTF-8 to std::wstring conversions.
const TranslatableString name
The interface that all file import "plugins" (if you want to call them that) must implement....
std::vector< std::shared_ptr< TrackList > > TrackHolders
static Importer::RegisteredImportPlugin registered
std::vector< TranslatableString > TranslatableStrings
This simplifies arrays of arrays, each array separately allocated with NEW[] But it might be better t...
void reinit(Integral count, bool initialize=false)
The top-level handle to an Audacity project. It serves as a source of events that other objects can b...
bool IsStopped() const noexcept
bool IsCancelled() const noexcept
unsigned long long ByteCount
Base class for FlacImportPlugin, LOFImportPlugin, MP3ImportPlugin, OggImportPlugin and PCMImportPlugi...
Interface used to report on import state and progress.
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.
Holds a msgid for the translation catalog; may also bind format arguments.
An ImportFileHandle for WavPack data.
TranslatableString GetFileDescription() override
void SetStreamUsage(wxInt32 StreamID, bool Use) override
WavpackContext * mWavPackContext
ByteCount GetFileUncompressedBytes() override
wxInt32 GetStreamCount() override
WavPackImportFileHandle(const FilePath &filename, WavpackContext *wavpackContext)
void Import(ImportProgressListener &progressListener, WaveTrackFactory *trackFactory, TrackHolders &outTracks, Tags *tags) override
const TranslatableStrings & GetStreamInfo() override
~WavPackImportFileHandle()
An ImportPlugin for WavPack data.
std::unique_ptr< ImportFileHandle > Open(const FilePath &Filename, AudacityProject *) override
TranslatableString GetPluginFormatDescription() override
wxString GetPluginStringID() override
Used to create or clone a WaveTrack, with appropriate context from the project that will own the trac...
A Track that contains audio waveform data.
Extend wxArrayString with move operations and construction and insertion fromstd::initializer_list.
auto end(const Ptr< Type, BaseDeleter > &p)
Enables range-for.
auto begin(const Ptr< Type, BaseDeleter > &p)
Enables range-for.
wxString ToWXString(const std::string &str)