Commit 948b5a5c authored by David Pollack's avatar David Pollack Committed by Soumith Chintala
Browse files

fixed temp file effects bug for mac

parent e95c8f5a
......@@ -70,18 +70,20 @@ class Test_SoxEffectsChain(unittest.TestCase):
E.append_effect_to_chain("rate", [si_in.rate])
E.append_effect_to_chain("channels", [si_in.channels])
x, sr = E.sox_build_flow_effects()
#print(x.size(), sr)
# The chorus effect will make the output file longer than the input
self.assertGreater(x.size(1) * x.size(0), si_in.length)
def test_synth(self):
si_in, ei_in = torchaudio.info(self.test_filepath)
len_in_seconds = si_in.length / si_in.channels / si_in.rate
ei_in.encoding = torchaudio.get_sox_encoding_t(1)
E = torchaudio.sox_effects.SoxEffectsChain(out_encinfo=ei_in, out_siginfo=si_in)
E.set_input_file(self.test_filepath)
E.append_effect_to_chain("synth", ["1", "pinknoise", "mix"])
E.append_effect_to_chain("synth", [str(len_in_seconds), "pinknoise", "mix"])
E.append_effect_to_chain("rate", [44100])
E.append_effect_to_chain("channels", [2])
x, sr = E.sox_build_flow_effects()
#print(x.size(), sr)
self.assertEqual(si_in.length, x.size(0) * x.size(1))
def test_gain(self):
E = torchaudio.sox_effects.SoxEffectsChain()
......@@ -120,7 +122,7 @@ class Test_SoxEffectsChain(unittest.TestCase):
x_orig, _ = torchaudio.load(self.test_filepath)
offset = "10000s"
offset_int = int(offset[:-1])
num_frames = "200s"
num_frames = "20000s"
num_frames_int = int(num_frames[:-1])
E = torchaudio.sox_effects.SoxEffectsChain()
E.set_input_file(self.test_filepath)
......
#include <torch/torch.h>
#include <torch/extension.h>
#include <sox.h>
......@@ -266,7 +266,7 @@ int build_flow_effects(const std::string& file_name,
int tmp_fd = mkstemp(tmp_name);
close(tmp_fd);
sox_format_t* output = sox_open_write(tmp_name, target_signal,
target_encoding, file_type, nullptr, nullptr);
target_encoding, "wav", nullptr, nullptr);
#else
// create buffer and buffer_size for output in memwrite
char* buffer;
......@@ -331,24 +331,27 @@ int build_flow_effects(const std::string& file_name,
int sr;
// Read the in-memory audio buffer or temp file that we just wrote.
#ifdef __APPLE__
/* certain effects will result in a target signal length of 0.
if (target_signal->length > 0) {
if (target_signal->channels != output->signal.channels) {
//std::cout << "output: " << output->signal.channels << "|" << output->signal.length << "\n";
//std::cout << "target: " << target_signal->channels << "|" << target_signal->length << "\n";
std::cout << "output: " << output->signal.channels << "|" << output->signal.length << "\n";
std::cout << "interm: " << interm_signal.channels << "|" << interm_signal.length << "\n";
std::cout << "target: " << target_signal->channels << "|" << target_signal->length << "\n";
unlink(tmp_name);
throw std::runtime_error("unexpected number of audio channels");
}
sr = read_audio_file(tmp_name, otensor, ch_first, 0, 0,
&output->signal, &output->encoding, file_type);
} else {
sr = read_audio_file(tmp_name, otensor, ch_first, 0, 0,
target_signal, target_encoding, file_type);
}
*/
// read_audio_file reads the temporary file and returns the sr and otensor
sr = read_audio_file(tmp_name, otensor, ch_first, 0, 0,
target_signal, target_encoding, "wav");
// delete temporary audio file
unlink(tmp_name);
#else
// Resize output tensor to desired dimensions, different effects result in output->signal.length,
// interm_signal.length and buffer size being inconsistent with the result of the file output.
// We prioritize in the order: output->signal.length > interm_signal.length > buffer_size
// Could be related to: https://sourceforge.net/p/sox/bugs/314/
int nc, ns;
if (output->signal.length == 0) {
if (interm_signal.length > (buffer_size * 10)) {
......@@ -382,7 +385,7 @@ int build_flow_effects(const std::string& file_name,
// free buffer
free(buffer);
#endif
// return sample rate, output tensor modified in-place
return sr;
}
} // namespace audio
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment