bool decode_file(char const * p_path,audio_chunk& chunk, abort_callback & p_abort) { try { input_helper helper; file_info_impl info; // open input helper.open(service_ptr_t<file>(), make_playable_location(p_path, 0), input_flag_simpledecode, p_abort); helper.get_info(0, info, p_abort); if (info.get_length() <= 0) throw pfc::exception("Track length invalid"); audio_chunk_impl chunk; if (!helper.run(chunk, p_abort)) return false; t_uint64 length_samples = audio_math::time_to_samples(info.get_length(), chunk.get_sample_rate()); while (true) { bool decode_done = !helper.run(chunk, p_abort); if (decode_done) break; } return true; } catch (const exception_aborted &) {throw;} catch (const std::exception & exc) { console::formatter() << exc << ": " << p_path; return false; } };
void PrepareFFTChunk(audio_chunk const & source, audio_chunk & out, double centerOffset) { const t_size channels = source.get_channel_count(); const t_uint32 sampleRate = source.get_sample_rate(); FB2K_DYNAMIC_ASSERT( sampleRate > 0 ); out.set_channels(channels, source.get_channel_config()); out.set_sample_rate(sampleRate); const t_size inSize = source.get_sample_count(); const t_size fftSize = MatchFFTSize(inSize); out.set_sample_count(fftSize); out.set_data_size(fftSize * channels); if (fftSize >= inSize) { //rare case with *REALLY* small input pfc::memcpy_t( out.get_data(), source.get_data(), inSize * channels ); pfc::memset_null_t( out.get_data() + inSize * channels, (fftSize - inSize) * channels ); } else { //inSize > fftSize, we're using a subset of source chunk for the job, pick a subset around centerOffset. const double baseOffset = pfc::max_t<double>(0, centerOffset - 0.5 * (double)fftSize / (double)sampleRate); const t_size baseSample = pfc::min_t<t_size>( (t_size) audio_math::time_to_samples(baseOffset, sampleRate), inSize - fftSize); pfc::memcpy_t( out.get_data(), source.get_data() + baseSample * channels, fftSize * channels); } }