Skip to content

Commit 4dca279

Browse files
gijzelaerrclaude
andcommitted
Fix clang-format violations and add type stubs for channel conversion
Fixes CI failures from psobot's spotify#453 (channel conversion feature): - Apply clang-format (LLVM style) to ReadableAudioFile.h, ChannelConvertedReadableAudioFile.h, and python_bindings.cpp - Add ChannelConvertedReadableAudioFile class to type stubs - Add mono(), stereo(), with_channels() method stubs to ReadableAudioFile, ResampledReadableAudioFile, and ChannelConvertedReadableAudioFile - Add resampled_to() method stubs to ResampledReadableAudioFile and ChannelConvertedReadableAudioFile (inherited from abstract base) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 3d2c62c commit 4dca279

4 files changed

Lines changed: 388 additions & 34 deletions

File tree

pedalboard/io/ChannelConvertedReadableAudioFile.h

Lines changed: 29 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -36,14 +36,16 @@ namespace Pedalboard {
3636

3737
/**
3838
* A wrapper class that converts audio channel counts on-the-fly.
39-
* Wraps any AbstractReadableAudioFile (ReadableAudioFile, ResampledReadableAudioFile, etc.)
39+
* Wraps any AbstractReadableAudioFile (ReadableAudioFile,
40+
* ResampledReadableAudioFile, etc.)
4041
*/
4142
class ChannelConvertedReadableAudioFile
4243
: public AbstractReadableAudioFile,
4344
public std::enable_shared_from_this<ChannelConvertedReadableAudioFile> {
4445
public:
4546
ChannelConvertedReadableAudioFile(
46-
std::shared_ptr<AbstractReadableAudioFile> audioFile, int targetNumChannels)
47+
std::shared_ptr<AbstractReadableAudioFile> audioFile,
48+
int targetNumChannels)
4749
: wrappedFile(audioFile), targetNumChannels(targetNumChannels) {
4850
if (targetNumChannels < 1) {
4951
throw std::domain_error("Target number of channels must be at least 1.");
@@ -80,9 +82,7 @@ class ChannelConvertedReadableAudioFile
8082
return wrappedFile->getLengthInSamples();
8183
}
8284

83-
double getDuration() const override {
84-
return wrappedFile->getDuration();
85-
}
85+
double getDuration() const override { return wrappedFile->getDuration(); }
8686

8787
long getNumChannels() const override { return targetNumChannels; }
8888

@@ -98,7 +98,8 @@ class ChannelConvertedReadableAudioFile
9898
return wrappedFile->getFileDatatype();
9999
}
100100

101-
py::array_t<float> read(std::variant<double, long long> numSamplesVariant) override {
101+
py::array_t<float>
102+
read(std::variant<double, long long> numSamplesVariant) override {
102103
long long numSamples = parseNumSamples(numSamplesVariant);
103104
if (numSamples == 0)
104105
throw std::domain_error(
@@ -152,10 +153,12 @@ class ChannelConvertedReadableAudioFile
152153
return juce::AudioBuffer<float>(targetNumChannels, 0);
153154
}
154155

155-
// Create output buffer and copy data while we still have access to the array
156+
// Create output buffer and copy data while we still have access to the
157+
// array
156158
outputBuffer.setSize(targetNumChannels, actualSamplesRead);
157159
float *sourcePtr = static_cast<float *>(sourceInfo.ptr);
158-
copyChannelData(outputBuffer, sourcePtr, sourceNumChannels, actualSamplesRead);
160+
copyChannelData(outputBuffer, sourcePtr, sourceNumChannels,
161+
actualSamplesRead);
159162
}
160163

161164
return outputBuffer;
@@ -210,9 +213,7 @@ class ChannelConvertedReadableAudioFile
210213
wrappedFile->seekInternal(targetPosition);
211214
}
212215

213-
long long tell() const override {
214-
return wrappedFile->tell();
215-
}
216+
long long tell() const override { return wrappedFile->tell(); }
216217

217218
void close() override {
218219
py::gil_scoped_release release;
@@ -234,9 +235,7 @@ class ChannelConvertedReadableAudioFile
234235
return _isClosed;
235236
}
236237

237-
bool isSeekable() const override {
238-
return wrappedFile->isSeekable();
239-
}
238+
bool isSeekable() const override { return wrappedFile->isSeekable(); }
240239

241240
std::optional<std::string> getFilename() const override {
242241
return wrappedFile->getFilename();
@@ -273,7 +272,8 @@ class ChannelConvertedReadableAudioFile
273272
inline py::class_<ChannelConvertedReadableAudioFile, AbstractReadableAudioFile,
274273
std::shared_ptr<ChannelConvertedReadableAudioFile>>
275274
declare_readable_audio_file_with_channel_conversion(py::module &m) {
276-
return py::class_<ChannelConvertedReadableAudioFile, AbstractReadableAudioFile,
275+
return py::class_<ChannelConvertedReadableAudioFile,
276+
AbstractReadableAudioFile,
277277
std::shared_ptr<ChannelConvertedReadableAudioFile>>(
278278
m, "ChannelConvertedReadableAudioFile",
279279
R"(
@@ -319,18 +319,20 @@ inline void init_readable_audio_file_with_channel_conversion(
319319
// Note: Most methods are inherited from AbstractReadableAudioFile.
320320
// We only define class-specific methods here.
321321
pyChannelConvertedReadableAudioFile
322-
.def(py::init([](std::shared_ptr<AbstractReadableAudioFile> audioFile,
323-
int targetNumChannels)
324-
-> ChannelConvertedReadableAudioFile * {
325-
// This definition is only here to provide nice docstrings.
326-
throw std::runtime_error(
327-
"Internal error: __init__ should never be called, as this "
328-
"class implements __new__.");
329-
}),
330-
py::arg("audio_file"), py::arg("num_channels"))
322+
.def(
323+
py::init(
324+
[](std::shared_ptr<AbstractReadableAudioFile> audioFile,
325+
int targetNumChannels) -> ChannelConvertedReadableAudioFile * {
326+
// This definition is only here to provide nice docstrings.
327+
throw std::runtime_error(
328+
"Internal error: __init__ should never be called, as this "
329+
"class implements __new__.");
330+
}),
331+
py::arg("audio_file"), py::arg("num_channels"))
331332
.def_static(
332333
"__new__",
333-
[](const py::object *, std::shared_ptr<AbstractReadableAudioFile> audioFile,
334+
[](const py::object *,
335+
std::shared_ptr<AbstractReadableAudioFile> audioFile,
334336
int targetNumChannels) {
335337
return std::make_shared<ChannelConvertedReadableAudioFile>(
336338
audioFile, targetNumChannels);
@@ -390,8 +392,7 @@ inline void init_abstract_readable_audio_file_methods(
390392
if (file->getNumChannels() == 1)
391393
return file;
392394

393-
return std::make_shared<ChannelConvertedReadableAudioFile>(
394-
file, 1);
395+
return std::make_shared<ChannelConvertedReadableAudioFile>(file, 1);
395396
},
396397
"Return a :class:`ChannelConvertedReadableAudioFile` that will "
397398
"automatically convert this audio file to mono (1 channel).\n\nIf "
@@ -406,8 +407,7 @@ inline void init_abstract_readable_audio_file_methods(
406407
if (file->getNumChannels() == 2)
407408
return file;
408409

409-
return std::make_shared<ChannelConvertedReadableAudioFile>(
410-
file, 2);
410+
return std::make_shared<ChannelConvertedReadableAudioFile>(file, 2);
411411
},
412412
"Return a :class:`ChannelConvertedReadableAudioFile` that will "
413413
"automatically convert this audio file to stereo (2 "

pedalboard/io/ReadableAudioFile.h

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -234,7 +234,9 @@ class ReadableAudioFile
234234
return numFrames + (lengthCorrection ? *lengthCorrection : 0);
235235
}
236236

237-
double getDuration() const override { return numFrames / getSampleRateAsDouble(); }
237+
double getDuration() const override {
238+
return numFrames / getSampleRateAsDouble();
239+
}
238240

239241
long getNumChannels() const override { return numChannels; }
240242

@@ -248,7 +250,8 @@ class ReadableAudioFile
248250

249251
std::string getFileDatatype() const override { return fileDatatype; }
250252

251-
py::array_t<float> read(std::variant<double, long long> numSamplesVariant) override {
253+
py::array_t<float>
254+
read(std::variant<double, long long> numSamplesVariant) override {
252255
long long numSamples = parseNumSamples(numSamplesVariant);
253256

254257
if (numSamples == 0)
@@ -796,8 +799,8 @@ class ChannelConvertedReadableAudioFile;
796799

797800
inline void init_readable_audio_file(
798801
py::module &m,
799-
py::class_<ReadableAudioFile, AbstractReadableAudioFile, std::shared_ptr<ReadableAudioFile>>
800-
&pyReadableAudioFile) {
802+
py::class_<ReadableAudioFile, AbstractReadableAudioFile,
803+
std::shared_ptr<ReadableAudioFile>> &pyReadableAudioFile) {
801804
// Note: Most methods are inherited from AbstractReadableAudioFile.
802805
// We only define class-specific methods here.
803806
pyReadableAudioFile

pedalboard/python_bindings.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,9 +65,9 @@ namespace py = pybind11;
6565

6666
#include "io/AudioFileInit.h"
6767
#include "io/AudioStream.h"
68+
#include "io/ChannelConvertedReadableAudioFile.h"
6869
#include "io/ReadableAudioFile.h"
6970
#include "io/ResampledReadableAudioFile.h"
70-
#include "io/ChannelConvertedReadableAudioFile.h"
7171
#include "io/StreamResampler.h"
7272
#include "io/WriteableAudioFile.h"
7373

0 commit comments

Comments
 (0)