annotate foosdk/sdk/foobar2000/foo_sample/decode.cpp @ 1:20d02a178406 default tip

*: check in everything else yay
author Paper <paper@tflc.us>
date Mon, 05 Jan 2026 02:15:46 -0500
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1 #include "stdafx.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2 #include <helpers/input_helpers.h>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4 class calculate_peak_process : public threaded_process_callback {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6 calculate_peak_process(metadb_handle_list_cref items) : m_items(items), m_peak() {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 void on_init(ctx_t p_wnd) override {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 void run(threaded_process_status & p_status,abort_callback & p_abort) override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 try {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 const t_uint32 decode_flags = input_flag_no_seeking | input_flag_no_looping; // tell the decoders that we won't seek and that we don't want looping on formats that support looping.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11 input_helper input; // this object manages lowlevel input_decoder calls for us.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 for(t_size walk = 0; walk < m_items.get_size(); ++walk) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 p_abort.check(); // in case the input we're working with fails at doing this
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 p_status.set_progress(walk, m_items.get_size());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 p_status.set_progress_secondary(0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 p_status.set_item_path( m_items[walk]->get_path() );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 input.open(NULL, m_items[walk], decode_flags, p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 double length;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 { // fetch the track length for proper dual progress display;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 file_info_impl info;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 // input.open should have preloaded relevant info, no need to query the input itself again.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23 // Regular get_info() may not retrieve freshly loaded info yet at this point (it will start giving the new info when relevant info change callbacks are dispatched); we need to use get_info_async.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 if (m_items[walk]->get_info_async(info)) length = info.get_length();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 else length = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 audio_chunk_impl_temporary l_chunk;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 double decoded = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 while(input.run(l_chunk, p_abort)) { // main decode loop
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 m_peak = l_chunk.get_peak(m_peak);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 if (length > 0) { // don't bother for unknown length tracks
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 decoded += l_chunk.get_duration();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 if (decoded > length) decoded = length;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 p_status.set_progress_secondary_float(decoded / length);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 p_abort.check(); // in case the input we're working with fails at doing this
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 } catch(std::exception const & e) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 m_failMsg = e.what();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44 void on_done(ctx_t p_wnd,bool p_was_aborted) override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 if (!p_was_aborted) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 if (!m_failMsg.is_empty()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 popup_message::g_complain("Peak scan failure", m_failMsg);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 pfc::string_formatter result;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 result << "Value: " << m_peak << "\n\n";
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 result << "Scanned items:\n";
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 for(t_size walk = 0; walk < m_items.get_size(); ++walk) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53 result << m_items[walk] << "\n";
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 popup_message::g_show(result,"Peak scan result");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60 audio_sample m_peak;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61 pfc::string8 m_failMsg;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62 const metadb_handle_list m_items;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65 void RunCalculatePeak(metadb_handle_list_cref data) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 try {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67 if (data.get_count() == 0) throw pfc::exception_invalid_params();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 service_ptr_t<threaded_process_callback> cb = new service_impl_t<calculate_peak_process>(data);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69 static_api_ptr_t<threaded_process>()->run_modeless(
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70 cb,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71 threaded_process::flag_show_progress_dual | threaded_process::flag_show_item | threaded_process::flag_show_abort,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72 core_api::get_main_window(),
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73 "Sample component: peak scan");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74 } catch(std::exception const & e) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75 popup_message::g_complain("Could not start peak scan process", e);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77 }