Exemplo n.º 1
0
bool OptionHandler::renderWaveformImage(
    const boost::filesystem::path& input_filename,
    const boost::filesystem::path& output_filename,
    const Options& options)
{
    const std::unique_ptr<ScaleFactor> scale_factor = createScaleFactor(options);

    int output_samples_per_pixel = 0;

    WaveformBuffer input_buffer;

    const boost::filesystem::path input_file_ext = input_filename.extension();

    if (input_file_ext == ".dat") {
        if (!input_buffer.load(input_filename.c_str())) {
            return false;
        }

        output_samples_per_pixel = scale_factor->getSamplesPerPixel(
            input_buffer.getSampleRate()
        );
    }
    else {
        std::unique_ptr<AudioFileReader> audio_file_reader(
            createAudioFileReader(input_filename)
        );

        if (!audio_file_reader->open(input_filename.c_str())) {
            return false;
        }

        WaveformGenerator processor(input_buffer, *scale_factor);

        if (!audio_file_reader->run(processor)) {
            return false;
        }

        output_samples_per_pixel = input_buffer.getSamplesPerPixel();
    }

    WaveformBuffer output_buffer;
    WaveformBuffer* render_buffer = nullptr;

    const int input_samples_per_pixel = input_buffer.getSamplesPerPixel();

    if (output_samples_per_pixel == input_samples_per_pixel) {
        // No need to rescale
        render_buffer = &input_buffer;
    }
    else if (output_samples_per_pixel > input_samples_per_pixel) {
        WaveformRescaler rescaler;

        if (!rescaler.rescale(
            input_buffer,
            output_buffer,
            output_samples_per_pixel))
        {
            return false;
        }

        render_buffer = &output_buffer;
    }
    else {
        error_stream << "Invalid zoom, minimum: " << input_samples_per_pixel << '\n';
        return false;
    }

    const WaveformColors colors = createWaveformColors(options);

    GdImageRenderer renderer;

    if (!renderer.create(
        *render_buffer,
        options.getStartTime(),
        options.getImageWidth(),
        options.getImageHeight(),
        colors,
        options.getRenderAxisLabels()))
    {
        return false;
    }

    return renderer.saveAsPng(
        output_filename.c_str(),
        options.getPngCompressionLevel()
    );
}
Exemplo n.º 2
0
bool OptionHandler::renderWaveformImage(
    const boost::filesystem::path& input_filename,
    const boost::filesystem::path& output_filename,
    const Options& options)
{
    const std::unique_ptr<ScaleFactor> scale_factor = createScaleFactor(options);

    int output_samples_per_pixel = 0;

    WaveformBuffer input_buffer;

    const boost::filesystem::path input_file_ext = input_filename.extension();

    if (input_file_ext == ".dat") {
        if (!input_buffer.load(input_filename.string().c_str())) {
            return false;
        }

        output_samples_per_pixel = scale_factor->getSamplesPerPixel(
            input_buffer.getSampleRate()
        );
    }
    else {
        std::unique_ptr<AudioFileReader> audio_file_reader(
            createAudioFileReader(input_filename)
        );

        if (!audio_file_reader->open(input_filename.string().c_str())) {
            return false;
        }

        WaveformGenerator processor(input_buffer, *scale_factor);

        if (!audio_file_reader->run(processor)) {
            return false;
        }

        output_samples_per_pixel = input_buffer.getSamplesPerPixel();
    }

    WaveformBuffer output_buffer;
    WaveformBuffer* render_buffer = nullptr;

    const int input_samples_per_pixel = input_buffer.getSamplesPerPixel();

    if (output_samples_per_pixel == input_samples_per_pixel) {
        // No need to rescale
        render_buffer = &input_buffer;
    }
    else if (output_samples_per_pixel > input_samples_per_pixel) {
        WaveformRescaler rescaler;

        if (!rescaler.rescale(
            input_buffer,
            output_buffer,
            output_samples_per_pixel))
        {
            return false;
        }

        render_buffer = &output_buffer;
    }
    else {
        error_stream << "Invalid zoom, minimum: " << input_samples_per_pixel << '\n';
        return false;
    }

    const std::string& color_scheme = options.getColorScheme();

    WaveformColors colors;

    if (color_scheme == "audacity") {
        colors = audacity_waveform_colors;
    }
    else if (color_scheme == "audition") {
        colors = audition_waveform_colors;
    }
    else {
        error_stream << "Unknown color scheme: " << color_scheme << '\n';
        return false;
    }

    GdImageRenderer renderer;

    if (options.hasBorderColor()) {
        colors.border_color = options.getBorderColor();
    }

    if (options.hasBackgroundColor()) {
        colors.background_color = options.getBackgroundColor();
    }

    if (options.hasWaveformColor()) {
        colors.waveform_color = options.getWaveformColor();
    }

    if (options.hasAxisLabelColor()) {
        colors.axis_label_color = options.getAxisLabelColor();
    }

    if (!renderer.create(
        *render_buffer,
        options.getStartTime(),
        options.getImageWidth(),
        options.getImageHeight(),
        colors,
        options.getRenderAxisLabels()))
    {
        return false;
    }

    return renderer.saveAsPng(output_filename.string().c_str());
}