Skip to main content

Recent Posts

1
Also try to delete DeskbandControls.json in config folder and restart explorer, that should fix it, I guess...


I just deleted it, but I sent the file in email to you. My explorer is fine now. If you come up with the reason for conflict, I will try installing again. I like the program, one thing that would cool is the ability to switch playlists.
Ohh, one more thing before the crashes, I also changed the number of songs to be displayed.
2
Also try to delete DeskbandControls.json in config folder and restart explorer, that should fix it, I guess...
3
I would like to know what is left on computer after uninstalling, what does the program modify and leaves?
Hi!

First of all, if you can upload here your config located at C:\Users\%USERNAME%\AppData\Roaming\DeskbandControls\
that would help me to diagnose whats wrong. Also, make sure you are using the latest version.

Hi,
Thanks for response.
Yes, it is the new version. At first it worked for 5 minutes. But, I tried changing the size of picture, must have hurt the program.
After uninstalling, I tried installing again but it was too late and windows explorer and deskband didn't like each other anymore.
I will send you the .json file.

Cheers
4
3rd Party Plugins - (fb2k) / Re: foo_wave_seekbar
Last post by Zao -
I'll start with a disclaimer that I have no intent to fix the code or make any release. It took me over an hour to set up an environment that could build foo_wave_seekbar at all this time, and it's one that isn't fit for making releases with.

If you look closer at the Westbam track, you'll notice that both the playlist, the builtin seekbar and my seekbar agrees that it's around two seconds long. This information is based on what the decoder says about the song length. If I ask about track information, it tells me "oh 88704 samples at a sample rate of 44100".

As this can be an approximation sometimes, I have logic to either pad with silence or truncate, depending on if it the track decodes shorter or longer than expected. Normally this is fine as the difference is a few hundred samples at most.

A difference between the player and my component is that I need a reasonably accurate track length up-front due to how my analysis works. I split the file into parts that are individually filled as I decode. That information needs to be known before I start. The player can just keep decoding until the file ends, producing up to an infinite amount of bonus audio.

As for recovering interrupted playback, I don't believe in producing bogus waveforms. This component kind of has a base assumption that the source is capable of producing what it promises.

For the undersized file, it might be possible to try to decode a bit further than the promised sample count, just to see if the file seems to be overlong enough to make a difference in the waveform. If so, decode to the true end and use that as the sample count for a completely new run of the file. That would work for your 2s track, but would be extremely amusing on infinite songs like looping tracker modules, so nothing one can naïvely implement.

For files that throw exceptions, I assume all are fatal. I cannot distinguish between error kinds there, unless you're supposed to just try to continue decoding and hope for the best.

As some bloke mentioned in the other thread, consider fixing your files.
5
@EpicForever
The files you have problems with have decoding errors.
If you check them with http://www.foobar2000.org/components/view/foo_verifier you will see it.
You could also check running in a cmd line
Code: [Select]
ffmpeg -v error -i filename.ext -map 0:1 -f null - 2>error.log
You will need to fix the files for them to work.
For MPEG2, TS you could use https://www.videohelp.com/software/ProjectX to repair.

Alternative is to demux the files, fix them and remux to a new container.
If possible/supported remux to mp4,
https://en.wikipedia.org/wiki/Comparison_of_video_container_formats
as mkv with foobar2000 native decoder has slow seeking.

p.s. Some of the files you uploaded have two audio streams , foobar2000 will only play the first audio stream it finds.


6
General - (fb2k) / Re: New HDD and Mass lossless conversion
Last post by wcs13 -
Everything's fine at the moment.
FYI the whole conversion process took about 24 hours for all the 37.000 files (24.290 audio files + the remaining non-audio files).
I have handled each and everyone of the 46 faulty tracks. It's all good now.
I have also verified that every single non-audio file was copied, with the very useful WinMerge (highly recommended).
Now I have as expected, 34.290 starting FLAC files, and 34.290 converted FLAC 1.3.2 files.
I have added all the files to a big 68.580 files playlist, and sorted everything by path.
Finally, I have launched foo_bitcompare. It's running at the moment.

So far I have only one small complaint/feature request for @Peter : foo_bitcompare uses only one of my CPU cores, while foobar's Converter used all of them. On 68.580 files, it makes a huge difference ! This operation may take 12 hours or so. If my CPU had been used to 100%, it would have taken 3 hours...

Also, there is no "Pause" button (which would have been useful to give my CPU a break eventually), no "Processed files" counter, and no "Elapsed time / Estimated time" indicator, like in the Converter. I have only the progress bar. It's a bit too "basic"for my taste. Maybe foo_bitcompare wasn't initially thought for comparing so many tracks at once, but hey, that happens from time to time. ;)
7
3rd Party Plugins - (fb2k) / Re: foo_wave_seekbar
Last post by Rollin -
What is the difference between AMR-NB present in .amr container and in .3gp container, which causes the latter to be not displayed
I tried some 3gp files with amr audio and waveform is displayed correctly.
9
General - (fb2k) / Re: bad track or bad settings
Last post by localuser -
does the problem happen when using directsound as output?

Also can you give more specs on your system, OS and how the DAC is connected?

using a b150m nightelf motherboard, rx480 vcard and i5 6500 cpu. running windows10 and connected with micro usb.
i uninstalled mojo's drivers via device manager and reconnected my mojo(usb), then mojo(speaker) shows up at "soundcard video and game controllers". i can see "windows driver package - chords electronic" on control panel>programs and features. now i tried playing tracks at foobar at first i tried asio, ds and dsd as my output but it sounds shit literally shit then i tried using wasapi push(speakers mojo) and for some reason it sounds a whole lot better. not really sure how. and to try everything something firsti tried uninstalling "windows driver package - chords electronic" and for some reason an error shows up saying error file\c\system32\driverstore etc etc.
10
Dear all,

I currently try to convert and compile ASIO source code from Otachan with ASIOSDK2.3 and latest Foobar SDK.
I almost manage to make it works.

However, I don't undertstand how to register the output service with the current SDK.
I currently have the code below and I have the following errors in VS console.
Would a nice soul do help me ?

Regards.

Code: [Select]
1>------ Build started: Project: foo_output_asio, Configuration: Debug Win32 ------
1>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V140\Microsoft.CppBuild.targets(936,5): warning MSB8027: Two or more files with the name of stdafx.cpp will produce outputs to the same location. This can lead to an incorrect build result.  The files involved are ..\..\pfc\stdafx.cpp, ..\..\SDK\stdafx.cpp.
1>  foo_output_asio.cpp
1>c:\sdk\fb2k\foo_output_asio(dll)_051\shared\fb2kdebug.h(80): warning C4838: conversion from 'int' to 'const ULONG_PTR' requires a narrowing conversion
1>c:\sdk\fb2k\sdk\output.h(175): error C2039: 'g_advanced_settings_query': is not a member of 'output_asio'
1>  c:\sdk\fb2k\foo_output_asio(dll)_051\source\foo_output_asio.h(56): note: see declaration of 'output_asio'
1>  c:\sdk\fb2k\sdk\output.h(173): note: while compiling class template member function 't_uint32 output_entry_impl_t<T,output_entry>::get_config_flags(void)'
1>          with
1>          [
1>              T=output_asio
1>          ]
1>  c:\sdk\fb2k\sdk\service.h(620): note: see reference to class template instantiation 'output_entry_impl_t<T,output_entry>' being compiled
1>          with
1>          [
1>              T=output_asio
1>          ]
1>  c:\sdk\fb2k\sdk\output.h(186): note: see reference to class template instantiation 'service_factory_single_t<output_entry_impl_t<T,output_entry>>' being compiled
1>          with
1>          [
1>              T=output_asio
1>          ]
1>  c:\sdk\fb2k\foo_output_asio(dll)_051\source\foo_output_asio.cpp(25): note: see reference to class template instantiation 'output_factory_t<output_asio>' being compiled
1>c:\sdk\fb2k\sdk\output.h(175): error C3861: 'g_advanced_settings_query': identifier not found
1>c:\sdk\fb2k\sdk\output.h(176): error C2039: 'g_needs_bitdepth_config': is not a member of 'output_asio'
1>  c:\sdk\fb2k\foo_output_asio(dll)_051\source\foo_output_asio.h(56): note: see declaration of 'output_asio'
1>c:\sdk\fb2k\sdk\output.h(176): error C3861: 'g_needs_bitdepth_config': identifier not found
1>c:\sdk\fb2k\sdk\output.h(177): error C2039: 'g_needs_dither_config': is not a member of 'output_asio'
1>  c:\sdk\fb2k\foo_output_asio(dll)_051\source\foo_output_asio.h(56): note: see declaration of 'output_asio'
1>c:\sdk\fb2k\sdk\output.h(177): error C3861: 'g_needs_dither_config': identifier not found
1>c:\sdk\fb2k\sdk\output.h(178): error C2039: 'g_needs_device_list_prefixes': is not a member of 'output_asio'
1>  c:\sdk\fb2k\foo_output_asio(dll)_051\source\foo_output_asio.h(56): note: see declaration of 'output_asio'
1>c:\sdk\fb2k\sdk\output.h(178): error C3861: 'g_needs_device_list_prefixes': identifier not found

Code: [Select]
/*
** foo_output_asio - ASIO output for foobar2000
**
** 2006/2/25 Written by Otachan
** http://otachan.com/
*/

#define STRICT

#include <windows.h>
#include <process.h>

#include "foo_output_asio.h"
#include "pcmasio.h"

extern HINSTANCE WSLhInstance;

extern AsioDrivers* asioDrivers;

//service_factory_single_t<initquit, initquit_output_asio> foo;
//service_factory_t<output, output_asio> foo2;

initquit_factory_t<initquit_output_asio> foo;
output_factory_t<output_asio> foo2;

//service_factory_single_t<initquit_output_asio> foo;
//service_factory_t<output_asio> foo2;

DECLARE_COMPONENT_VERSION(
NAME,
VER,
NAME " v" VER "\n\n"
"Copyright (C) 2003-2006 Otachan\n"
"http://otachan.com/\n\n"
"ASIO Technology by Steinberg.");

// {38B5B07D-532B-472B-B406-A484630A5021}
static const GUID guid_cfg_device =
{ 0x38b5b07d, 0x532b, 0x472b,{ 0xb4, 0x6, 0xa4, 0x84, 0x63, 0xa, 0x50, 0x21 } };

// {1D2540D2-5941-4787-AA60-E756ABCF32E5}
static const GUID guid_cfg_thread_priority =
{ 0x1d2540d2, 0x5941, 0x4787,{ 0xaa, 0x60, 0xe7, 0x56, 0xab, 0xcf, 0x32, 0xe5 } };

// {FD8C6045-CF61-4188-A0EA-12BB9D69062F}
static const GUID guid_cfg_buffer_size =
{ 0xfd8c6045, 0xcf61, 0x4188,{ 0xa0, 0xea, 0x12, 0xbb, 0x9d, 0x69, 0x6, 0x2f } };

// {8F295CD2-55AD-4771-95CA-3242871D5A4C}
static const GUID guid_cfg_shift_channels =
{ 0x8f295cd2, 0x55ad, 0x4771,{ 0x95, 0xca, 0x32, 0x42, 0x87, 0x1d, 0x5a, 0x4c } };

// {9E3A57CF-5D71-4667-AAFF-2F6E95212612}
static const GUID guid_direct_input_monitor =
{ 0x9e3a57cf, 0x5d71, 0x4667,{ 0xaa, 0xff, 0x2f, 0x6e, 0x95, 0x21, 0x26, 0x12 } };


cfg_int cfg_device(guid_cfg_device, 0);
cfg_int cfg_thread_priority(guid_cfg_thread_priority, 3);
cfg_int cfg_buffer_size(guid_cfg_buffer_size, 7);
cfg_int cfg_shift_channels(guid_cfg_shift_channels, 0);
cfg_int cfg_direct_input_monitor(guid_direct_input_monitor, 0);

CRITICAL_SECTION CriticalSectionInit;

PcmAsio* pPcmAsio;

HANDLE hThread;
HANDLE EventReadyThread;
HANDLE EventDestroyThread;

bool InitDLL;

BOOL WINAPI
DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID /*lpvReserved*/)
{
switch(fdwReason) {
case DLL_PROCESS_ATTACH:
::InitializeCriticalSection(&CriticalSectionInit);

WSLhInstance = hinstDLL;

InitDLL = false;
break;
case DLL_PROCESS_DETACH:
::DeleteCriticalSection(&CriticalSectionInit);
break;
}

return true;
}

unsigned int __stdcall
ThreadProc(void* /*Param*/)
{
asioDrivers = new AsioDrivers;
pPcmAsio = new PcmAsio;

::SetEvent(EventReadyThread);

while(::WaitForSingleObjectEx(EventDestroyThread, INFINITE, true) != WAIT_OBJECT_0);

delete pPcmAsio;
delete asioDrivers;

_endthreadex(0);

return 0;
}

void CALLBACK
ApcProc(ULONG_PTR dwParam)
{
ParamMsg* const Param = reinterpret_cast<ParamMsg*>(dwParam);

switch(Param->Msg) {
case MSG_CLOSE_DRIVER:
pPcmAsio->CloseDriver();
break;
case MSG_OPEN:
Param->RetMsg = pPcmAsio->MsgOpen(Param->Param1, Param->Param2, Param->Param3, Param->Param4);
break;
case MSG_CAN_WRITE:
Param->RetMsg = pPcmAsio->MsgCanWrite();
break;
case MSG_WRITE:
Param->RetMsg = pPcmAsio->MsgWrite(Param->Param1, Param->Buff);
break;
case MSG_PAUSE:
pPcmAsio->MsgPause(Param->Param1);
break;
case MSG_PLAY:
pPcmAsio->MsgPlay();
break;
case MSG_FLUSH:
Param->RetMsg = pPcmAsio->MsgFlush();
break;
}

Param->UnPause();
}

ParamMsg::ParamMsg(int _Msg)
{
Msg = _Msg;
}

ParamMsg::ParamMsg(int _Msg, int _Param1)
{
Msg = _Msg;
Param1 = _Param1;
}

ParamMsg::ParamMsg(int _Msg, int _Param1, int _Param2, int _Param3, int _Param4)
{
Msg = _Msg;
Param1 = _Param1;
Param2 = _Param2;
Param3 = _Param3;
Param4 = _Param4;
}

ParamMsg::ParamMsg(int _Msg, int _Param1, unsigned char* _Buff)
{
Msg = _Msg;
Param1 = _Param1;
Buff = _Buff;
}

int
ParamMsg::Call(void)
{
EventWaitThread = ::CreateEvent(NULL, false, false, NULL);

::QueueUserAPC(&ApcProc, hThread, reinterpret_cast<ULONG_PTR>(this));
::WaitForSingleObject(EventWaitThread, INFINITE);

::CloseHandle(EventWaitThread);

return RetMsg;
}

void
ParamMsg::UnPause(void)
{
::SetEvent(EventWaitThread);
}

void
Init(void)
{
::EnterCriticalSection(&CriticalSectionInit);

if(InitDLL == false) {
EventDestroyThread = ::CreateEvent(NULL, false, false, NULL);
EventReadyThread = ::CreateEvent(NULL, false, false, NULL);

unsigned int dwThread;

hThread = reinterpret_cast<HANDLE>(_beginthreadex(NULL, 0, ThreadProc, NULL, 0, &dwThread));

::WaitForSingleObject(EventReadyThread, INFINITE);

::CloseHandle(EventReadyThread);

InitDLL = true;
}

::LeaveCriticalSection(&CriticalSectionInit);
}

inline void
Quit(void)
{
::SetEvent(EventDestroyThread);

if(::WaitForSingleObject(hThread, 5000) != WAIT_OBJECT_0) {
if(::TerminateThread(hThread, 0)) {
::WaitForSingleObject(hThread, 3000);
}
}

::CloseHandle(hThread);
::CloseHandle(EventDestroyThread);
}


void
initquit_output_asio::on_init(void)
{
Init();
}

void
initquit_output_asio::on_quit(void)
{
Quit();
}

// ********************************** /
// output_asio
//

output_asio::output_asio(void)
{
Init();
OpenDriver = false;
}

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

int
output_asio::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::can_write(void)
{
return ParamMsg(MSG_CAN_WRITE).Call();
}

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

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

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

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

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

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