bool OptionHandler::generateWaveformData( const boost::filesystem::path& input_filename, const boost::filesystem::path& output_filename, const Options& options) { const std::unique_ptr<ScaleFactor> scale_factor = createScaleFactor(options); const boost::filesystem::path output_file_ext = output_filename.extension(); const std::unique_ptr<AudioFileReader> audio_file_reader = createAudioFileReader(input_filename); if (audio_file_reader == nullptr) { error_stream << "Unknown file type: " << input_filename << '\n'; return false; } if (!audio_file_reader->open(input_filename.c_str())) { return false; } WaveformBuffer buffer; WaveformGenerator processor(buffer, *scale_factor); if (!audio_file_reader->run(processor)) { return false; } assert(output_file_ext == ".dat" || output_file_ext == ".json"); const int bits = options.getBits(); if (output_file_ext == ".dat") { return buffer.save(output_filename.c_str(), bits); } else { return buffer.saveAsJson(output_filename.c_str(), bits); } }
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() ); }
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()); }