Skip to main content

Recent Posts

1
Here
Code: [Select]
void instantiate(service_ptr_t<output> & p_out, const GUID & p_device, double p_buffer_length, bool p_dither, t_uint32 p_bitdepth) {
    p_out = new service_impl_t<output_asio_instance>(p_device, p_buffer_length, p_dither, p_bitdepth);
};
you need to return instance of class derived from output (or output_v2), not from output_entry_asio.
2
How about splitting these files using converter (at least all lossless, so conversion will not change audio quality)?

Friend you did not understand my problem, I need to embed the cue sheets in my single batch files, or at least read the CUE file and update the single lossless file in your TAGS like GENRE and DATE, it is not feasible to do it on the finger, as I demonstrated with foobar2k, and I need to keep these files unique with CUE, because many albums are for shows, and others are for continuous tracks like Pink Floyd, Tha Alan Parsons Project, and the vast majority of media servers / the infamous GAP between the separate tracks which makes it unfeasible to listen to these albums.

Att.

Druid®.
3
I hope somebody can help me with the following issue:

I have installed foobar v1.3.16 and added foo_spdifer_1.0 component in order to play DTS 5.1 audio via S/PDF (optical) output.
I also added WASAPI.fb2k output component but only stereo audio appeared on my external Samsung player.
Can somebody tell me what should I do in order to setup the correct 5.1 output?

(VLC player can send the 5.1 signal via optical output, but I would like to use foobar instead)
4
I personally have converted all my cuesheet combined files to separate files using foobar2000. Works flawless.

Friend your response is totally out of context for what I'm needing, yet thank you for responding, and no I do not need what you did, even though there are many media servers / tank on the market that has the infamous GAP between the album tracks with separate tracks which is not feasible for concert albums and albums with continuous tracks (Pink Floyd, The Alan Parsons Project, etc.), so I preserve many unique albums with their corresponding CUE.

Att.

Druid®.
5
Hi,

Thank you for your answer. It was done in the meantime.
I think i'm not so far from the goal.

However when I try to register the class, I have these errors, and my current code is below.
It speaks about a reinterpret_cast, but i'm surprised to use that to be able to register the output.
Any idea ?

Regards.

Code: [Select]
c:\sdk\fb2k\pfc\primitives.h(186): error C2440: 'return': cannot convert from 'service_impl_t<output_asio_instance> *' to 'output::t_interface *'
1>  c:\sdk\fb2k\pfc\primitives.h(186): note: Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
1>  c:\sdk\fb2k\sdk\service.h(82): note: see reference to function template instantiation 't_ret *pfc::safe_ptr_cast<T,t_source>(t_param *)' being compiled
1>          with
1>          [
1>              t_ret=output::t_interface,
1>              T=output::t_interface,
1>              t_source=service_impl_t<output_asio_instance>,
1>              t_param=service_impl_t<output_asio_instance>
1>          ]

Code: [Select]
// ********************************** /
// class output_asio_instance
//

class output_asio_instance : public output_entry_asio
{
public:


output_asio_instance(const GUID & p_device, double p_buffer_length, bool p_dither, t_uint32 p_bitdepth)
{
Init();
OpenDriver = false;
}

~output_asio_instance(void)
{
if (OpenDriver) ParamMsg(MSG_CLOSE_DRIVER).Call();
}

static void g_advanced_settings_popup(HWND p_parent, POINT p_menupoint) {};
static int g_advanced_settings_query() { return output_entry::flag_needs_advanced_config; };
static int g_needs_dither_config() { return output_entry::flag_needs_dither_config; };
static int g_needs_bitdepth_config() { return output_entry::flag_needs_bitdepth_config; };
static int g_needs_device_list_prefixes() { return output_entry::flag_needs_device_list_prefixes; };
static const GUID g_get_guid(void)
{
// {3A5EDE8E-840D-497c-9774-156A12FC4275}
static const GUID guid =
{ 0x3a5ede8e, 0x840d, 0x497c,{ 0x97, 0x74, 0x15, 0x6a, 0x12, 0xfc, 0x42, 0x75 } };

return guid;
}

static const char* g_get_name(void)
{
return NAME2;
}

virtual const char* get_config_page_name(void)
{
return NAME2;
}

void instantiate(service_ptr_t<output> & p_out, const GUID & p_device, double p_buffer_length, bool p_dither, t_uint32 p_bitdepth) {

p_out = new service_impl_t<output_asio_instance>(p_device, p_buffer_length, p_dither, p_bitdepth);
};

void enum_devices(output_device_enum_callback &) {};
GUID get_guid() { g_get_guid(); };
const char *get_name(void) { g_get_name(); };
void advanced_settings_popup(HWND, POINT) {};
t_uint32 output_entry::get_config_flags(void) {};

void
output_asio_instance::open(const t_samplespec &) {};
void
output_asio_instance::pause(bool) {};
void
output_asio_instance::on_flush(void) {};
void
output_asio_instance::volume_set(double) {};
void
output_asio_instance::on_update(void) {};
void
output_asio_instance::write(const audio_chunk &) {};
t_size
output_asio_instance::can_write_samples(void) {
t_size val;
return val;
};
t_size
output_asio_instance::get_latency_samples(void) {
t_size val;
return val;
};


int
output_asio_instance::open_ex(int srate, int bps, int nch, int format_code)
{
const int RetCode = ParamMsg(MSG_OPEN, srate, format_code, bps, nch).Call();
OpenDriver = RetCode != 0;
return RetCode;
}

int
output_asio_instance::can_write(void)
{
return ParamMsg(MSG_CAN_WRITE).Call();
}

int
output_asio_instance::write(const char* data, int bytes)
{
return ParamMsg(MSG_WRITE, bytes,
reinterpret_cast<unsigned char*>(const_cast<char*>(data))).Call();
}

int
output_asio_instance::get_latency_bytes(void)
{
return pPcmAsio->MsgGetLatency();
}

void
output_asio_instance::pause(int state)
{
ParamMsg(MSG_PAUSE, state).Call();
}

void
output_asio_instance::force_play(void)
{
ParamMsg(MSG_PLAY).Call();
}

int
output_asio_instance::do_flush(void)
{
return ParamMsg(MSG_FLUSH).Call();
}

int
output_asio_instance::is_playing(void)
{
return !!pPcmAsio->MsgGetLatency();
}

};

output_factory_t<output_asio_instance> foo2;
6
Comment prepending class output_entry_impl_t from SDK/output.h states that "output_entry methods are forwarded to static methods of your output class". And in its code you can find calls like
Code: [Select]
if (T::g_advanced_settings_query()) flags |= output_entry::flag_needs_advanced_config;
'T' there is your output_asio class. In other words, output_asio implementation should contain static methods like
Code: [Select]
class output_asio {
public:
  static bool g_advanced_settings_query() { ... }
  static bool g_needs_bitdepth_config() { ... }
  // etc.
7
I like the ability to view by Folder in the Windows PC version since I have many ripped CD's that are a compilation of various artists. Installed Foobar2000 on my iPhone and it doesn't appear to have this ability.
8
REM is short for remark and it's only for humans to read.   They are ignored by the software.
9
Some additional / more general note:
I went to Windows 10 installation, because of Forza Horizon. Additionally I dug through foobar installation on that OS. I cleaned up components in similar manner as under Windows 7, with one exception  - I left there unconfigured foo_input_ffmpeg and I left there working foo_input_ds. I tested it with bunch of old Mvids, awaiting to be finally deleted after remuxing them to .mkv

Observations:
First of all - waveform seekbar works there very well on all tested video files (as it was usually, before I overloaded foobar with DLLs). All waveforms, for all supported video files are displayed and they don't disappear at any circumstances.
Then:
There are some files which are barely seekable (audio is reset to beginning upon any seek operation). But that changes when LAV Filters are re-installed from their separate installer (see below). This doesn't occur under Windows 7, where I use foo_input_ffmpeg - so here we have big advantage of this method of playing back audio from video files.
There are some files which incorrectly report their length, even after LAV reinstallation - they are cut by 20, 30, 45 seconds. What is specific: when all video files are played in foobar, in notification area I have just LAV Splitter and LAV Audio Decoder icons. But when some of these "broken" files come to its premature end - these icons start quickly appearing and disappearing with LAV Video Decoder showing up 2-3 times for an eye-blink. Waveform seekbar shows their waveform cut, accordingly to length reported on playlist, which is rather proper behavior. Such situations doesn't occur with foo_input_ffmpeg, with exception of Westbam - Hard Times.mpg mvid. Still an advantage of foo_input_ffmpeg method, which fails only with one file.
That Westbam - Hard Times mvid reports proper length when played through foo_input_ds and is properly seekable, with proper waveform in seekbar displayed... So it is totally different to what is achieved through foo_input_ffmpeg as a data feed for foo_waveform_seekbar, where file reports just 2-3 seconds of length. Together with files, which play and seek properly, but throw playback errors at their ends (which causes foo_waveform_seekbar to discard whole waveform data) we can see also some limitations in either ffmpeg.exe/fprobe.exe combination or foo_input_ffmpeg itself.

Now something closer to the topic:
Of course as a non developer, and as somebody who don't know exact pipelines in foobar / certain components I don't want to blame Peter for above mentioned problems which occurred when I was using his component and issues that occur in foo_waveform_seekbar. Having my above observations in mind I would like to simply ask for an expertise, if this is due to foo_input_ffmpeg's very rough handling of errors coming from ffmpeg.exe (present in decoded data stream as well as in form of any kind of control/debug messages - if they exist) OR if this is only due to ffmpeg.exe internal behavior (how it treats internally situation when source file is broken - how decoded stream is prepared in such situation and if ffmpeg cares in such cases how receiving party will read it). This will simply allow me to know overall limitations of the setup that I have and properly react to any errors in "through-ffmpeg-playback" that may occur in future.

Side note:
What I can say regarding the pain that was induced by foo_input_ds (which caused me to exchange it to foo_input_ffmpeg) - both Win 7 and Win 10 were installed at the same time, so I used the same KLCP installer on both, and used the same settings for installation. So I suppose this is KLCP installer that messes something in system (not the first one, but not all of them are such buggy). It may be also something with recent version of LAV filters, as in both cases (Win 7 & Win 10) installing just LAV Filters taken directly from their source doesn't change situation that much. I suspect it because afaik both KLCP installer and direct LAV installer install LAV in the same version, so that may suggest that it is this exact version of LAV to be blamed for problems when foo_input_ds was used.
10
MP3 - General / Re: Lame 3.100 has been released
Last post by includemeout -
LAME development is culminated. Last quality changes were made 6 years ago.
In the other hand LAME developers have squeezed all out of what MP3 can do.

Thank You for release.

:) life continues ...

Couldn't have said it better...
Yeah, LAME has definitely reached its pinnacle ever since.

The finest MP3, as a format, will ever be.