Search code examples
c++audioplaylistjuce

How to read the length of audio files using Juce "C++." Without playing the file


I'm trying to display the length of audio files in a Playlist component for an application. I've not used Juce or C++ before, and I can't understand how to do that from Juce documentation. I want to make a function that takes an audio file's URL and returns the length in seconds of that audio without playing that file or doing anything else with that file. I've tried a lot of things, and all of them didn't work, and this is the last thing I've tried:

void PlaylistComponent::trackStats(URL audioURL)
{
    AudioFormatManager formatManager;
    std::unique_ptr<AudioFormatReaderSource> readerSource;
    AudioTransportSource transportSource;

    auto* reader = formatManager.createReaderFor(audioURL.createInputStream(false));
    if (reader != nullptr) 
    {
        std::unique_ptr<AudioFormatReaderSource> newSource(new AudioFormatReaderSource(reader, true));
        transportSource.setSource(newSource.get(), 0, nullptr, reader->sampleRate);
        readerSource.reset(newSource.release());

        DBG("PlaylistComponent::trackStats(URL audioURL): " << transportSource.getLengthInSeconds());
    }
    else
    {
        DBG("Something went wrong loading the file");
    }
}

And this is the PlaylistComponent header file:

class PlaylistComponent  : public juce::Component, 
                           public juce::TableListBoxModel,
                           public Button::Listener,
                           public FileDragAndDropTarget
{
  ...
}

Solution

  • juce::AudioFormatReaderSource has a method called getTotalLength() which returns the total amount of samples. Divide that by the sample rate of the file and you have the total length in seconds. Something like this:

    if (auto* reader = audioFormatReaderSource->getAudioFormatReader())
        double lengthInSeconds = static_cast<double> (audioFormatReaderSource->getTotalLength()) / reader->sampleRate;