add last backwards-compatible version
This commit is contained in:
@@ -1,13 +1,9 @@
|
||||
#include "foobar2000.h"
|
||||
#include "output.h"
|
||||
#include "audio_chunk_impl.h"
|
||||
#include "dsp.h"
|
||||
#include "resampler.h"
|
||||
|
||||
pfc::string8 output_entry::get_device_name( const GUID & deviceID ) {
|
||||
pfc::string8 temp;
|
||||
if (!get_device_name(deviceID, temp)) temp = "[unknown device]";
|
||||
return temp;
|
||||
return std::move(temp);
|
||||
}
|
||||
|
||||
namespace {
|
||||
@@ -50,25 +46,8 @@ output_entry::ptr output_entry::g_find( const GUID & outputID ) {
|
||||
}
|
||||
|
||||
|
||||
bool output::is_progressing_() {
|
||||
output_v4::ptr v4;
|
||||
if ( v4 &= this ) return v4->is_progressing();
|
||||
return true;
|
||||
}
|
||||
|
||||
size_t output::update_v2_() {
|
||||
output_v4::ptr v4;
|
||||
if ( v4 &= this ) return v4->update_v2();
|
||||
bool bReady = false;
|
||||
this->update(bReady);
|
||||
return bReady ? SIZE_MAX : 0;
|
||||
}
|
||||
|
||||
pfc::eventHandle_t output::get_trigger_event_() {
|
||||
output_v4::ptr v4;
|
||||
if ( v4 &= this ) return v4->get_trigger_event();
|
||||
return pfc::eventInvalid;
|
||||
}
|
||||
|
||||
void output_impl::flush() {
|
||||
m_incoming_ptr = 0;
|
||||
@@ -80,11 +59,7 @@ void output_impl::flush_changing_track() {
|
||||
m_incoming.set_size(0);
|
||||
on_flush_changing_track();
|
||||
}
|
||||
|
||||
void output_impl::update(bool & p_ready) {
|
||||
p_ready = update_v2() > 0;
|
||||
}
|
||||
size_t output_impl::update_v2() {
|
||||
on_update();
|
||||
if (m_incoming_spec != m_active_spec && m_incoming_ptr < m_incoming.get_size()) {
|
||||
if (get_latency_samples() == 0) {
|
||||
@@ -93,8 +68,7 @@ size_t output_impl::update_v2() {
|
||||
} else {
|
||||
force_play();
|
||||
}
|
||||
}
|
||||
size_t retCanWriteSamples = 0;
|
||||
}
|
||||
if (m_incoming_spec == m_active_spec && m_incoming_ptr < m_incoming.get_size()) {
|
||||
t_size cw = can_write_samples() * m_incoming_spec.m_channels;
|
||||
t_size delta = pfc::min_t(m_incoming.get_size() - m_incoming_ptr,cw);
|
||||
@@ -102,13 +76,9 @@ size_t output_impl::update_v2() {
|
||||
write(audio_chunk_temp_impl(m_incoming.get_ptr()+m_incoming_ptr,delta / m_incoming_spec.m_channels,m_incoming_spec.m_sample_rate,m_incoming_spec.m_channels,m_incoming_spec.m_channel_config));
|
||||
m_incoming_ptr += delta;
|
||||
}
|
||||
retCanWriteSamples = (cw - delta) / m_incoming_spec.m_channels;
|
||||
} else if ( m_incoming_ptr == m_incoming.get_size() ) {
|
||||
retCanWriteSamples = SIZE_MAX;
|
||||
}
|
||||
return retCanWriteSamples;
|
||||
}
|
||||
p_ready = (m_incoming_ptr == m_incoming.get_size());
|
||||
}
|
||||
|
||||
double output_impl::get_latency() {
|
||||
double ret = 0;
|
||||
if (m_incoming_spec.is_valid()) {
|
||||
@@ -117,7 +87,7 @@ double output_impl::get_latency() {
|
||||
if (m_active_spec.is_valid()) {
|
||||
ret += audio_math::samples_to_time( get_latency_samples() , m_active_spec.m_sample_rate );
|
||||
}
|
||||
return ret;
|
||||
return ret;
|
||||
}
|
||||
void output_impl::process_samples(const audio_chunk & p_chunk) {
|
||||
pfc::dynamic_assert(m_incoming_ptr == m_incoming.get_size());
|
||||
@@ -131,50 +101,18 @@ void output_impl::process_samples(const audio_chunk & p_chunk) {
|
||||
}
|
||||
|
||||
void output_v3::get_injected_dsps( dsp_chain_config & dsps ) {
|
||||
#ifdef FOOBAR2000_HAVE_DSP
|
||||
dsps.remove_all();
|
||||
#if 0 // DEPRECATED
|
||||
unsigned rate = this->get_forced_sample_rate();
|
||||
if (rate != 0) {
|
||||
#if PFC_DEBUG
|
||||
FB2K_console_formatter() << "output_v3::get_injected_dsps() : requesting resampling to " << rate << " Hz";
|
||||
#endif
|
||||
dsp_preset_impl temp;
|
||||
if (resampler_entry::g_create_preset( temp, 0, rate, 0 )) {
|
||||
dsps.insert_item( temp, dsps.get_count() );
|
||||
} else {
|
||||
#if PFC_DEBUG
|
||||
FB2K_console_formatter() << "output_v3::get_injected_dsps() : resampler could not be created";
|
||||
#endif
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#endif // FOOBAR2000_HAVE_DSP
|
||||
}
|
||||
|
||||
size_t output_v4::update_v2() {
|
||||
bool bReady = false;
|
||||
update(bReady);
|
||||
return bReady ? SIZE_MAX : 0;
|
||||
}
|
||||
|
||||
uint32_t output_entry::get_config_flags_compat() {
|
||||
uint32_t ret = get_config_flags();
|
||||
if ((ret & (flag_low_latency | flag_high_latency)) == 0) {
|
||||
// output predating flag_high_latency + flag_low_latency
|
||||
// if it's old foo_out_upnp, report high latency, otherwise low latency.
|
||||
static const GUID guid_foo_out_upnp = { 0x9900b4f6, 0x8431, 0x4b0a, { 0x95, 0x56, 0xa7, 0xfc, 0xb9, 0x5b, 0x74, 0x3 } };
|
||||
if (this->get_guid() == guid_foo_out_upnp) ret |= flag_high_latency;
|
||||
else ret |= flag_low_latency;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
bool output_entry::is_high_latency() {
|
||||
return (this->get_config_flags_compat() & flag_high_latency) != 0;
|
||||
}
|
||||
|
||||
bool output_entry::is_low_latency() {
|
||||
return (this->get_config_flags_compat() & flag_low_latency) != 0;
|
||||
}
|
||||
|
||||
// {EEEB07DE-C2C8-44c2-985C-C85856D96DA1}
|
||||
const GUID output_id_null =
|
||||
|
||||
Reference in New Issue
Block a user