i have reduced the list of the components to the minimum to run my config, it just rest these :
...after playing some tracks, it keeps crashing (always the same panel in script error first, with all panels repaint freezed + toolbars too!)
EDIT:
i've removed foo_uie_channel_spectrum and foo_covers2 ==> ALWAYS REPAINT/FREEZE problem, with same Script Error on the same panel,
SO, if it's due to a bug in Beta 4 or 5, it's maybe triggered by my WSH script panel that always fall in error, so, here is the panel script, Thanx for using it for testing on your config (panel size used is ~ 600x120 pixels)
HOW TO REPRODUCE THE CRASH ? ==> i keep use NEXT TRACK playback action (tracks plays 1 or 2 seconds), to change tracks from a big playlist (happens too in a playlist with only one track, always repeated so), it takes differents number of track starts to get the problem [10:100] ...
(maybe with a script edit on the panel before, ... hard to say)
maybe a buffer overflow problem ?
//=================================================// Options
var c1 = RGB(20, 60, 120);
//=================================================// Title Format
var g_path = fb.TitleFormat("$left(%_path_raw%,4)");
var elap_seconds = fb.TitleFormat("%playback_time_seconds%");
var len_seconds = fb.Titleformat("%length_seconds%");
var first_played = fb.Titleformat("%first_played%");
var last_played = fb.Titleformat("%last_played%");
var play_counter = fb.Titleformat("%play_counter%");
var play_count = fb.Titleformat("%play_count%");
var tf_title = fb.TitleFormat("$if2(%title%,'N/A')");
var tf_artist = fb.TitleFormat("$if2(%artist%,'N/A')");
var tf_album = fb.TitleFormat("$if2(%album%,'Single')");
var tf_date = fb.TitleFormat("[%date%])");
var tf_playback_time = fb.TitleFormat("%playback_time%");
var tf_length = fb.TitleFormat("%length%");
//=================================================// Constants
// Use with GdiDrawText()
// {{
var DT_LEFT = 0x00000000;
var DT_RIGHT = 0x00000002;
var DT_TOP = 0x00000000;
var DT_CENTER = 0x00000001;
var DT_VCENTER = 0x00000004;
var DT_WORDBREAK = 0x00000010;
var DT_SINGLELINE = 0x00000020;
var DT_CALCRECT = 0x00000400;
var DT_NOPREFIX = 0x00000800;
var DT_EDITCONTROL = 0x00002000;
var DT_END_ELLIPSIS = 0x00008000;
// }}
var ButtonStates = {
normal: 0,
hover: 1,
down: 2
};
//=================================================// Tools
function RGB(r, g, b) {
return (0xff000000 | (r << 16) | (g << 8) | (b));
}
function RGBA(r, g, b, a) {
return ((a << 24) | (r << 16) | (g << 8) | (b));
}
//Text formatting function
function StringFormat() {
var h_align = 0,
v_align = 0,
trimming = 0,
flags = 0;
switch (arguments.length) {
// fall-thru
case 4:
flags = arguments[3];
case 3:
trimming = arguments[2];
case 2:
v_align = arguments[1];
case 1:
h_align = arguments[0];
break;
default:
return 0;
}
return ((h_align << 28) | (v_align << 24) | (trimming << 20) | flags);
}
StringAlignment = {
Near: 0,
Centre: 1,
Far: 2
};
function num(strg, nb) {
var i;
var str = strg.toString();
var k = nb - str.length;
if(k>0) {
for(i=0;i<k;i++) {
str = "0" + str;
}
}
return str.toString();
}
var l_stringformat = StringFormat(StringAlignment.Near, StringAlignment.Centre);
var lt_stringformat = StringFormat(StringAlignment.Near, StringAlignment.Near);
var c_stringformat = StringFormat(StringAlignment.Centre, StringAlignment.Centre);
var r_stringformat = StringFormat(StringAlignment.Far, StringAlignment.Centre);
var ct_stringformat = StringFormat(StringAlignment.Centre, StringAlignment.Far);
var g_metadb;
var g_notify_info = {};
var g_timer;
var g_timer_count=0;
var g_playback_time;
var g_length;
// Common global variables
var ww = window.Width;
var wh = window.Height;
var mouse_x;
var mouse_y;
//=================================================// Panel Callbacks
function on_size() {
var i;
ww = window.Width;
wh = window.Height;
on_item_focus_change();
}
function on_paint(gr) {
var i;
var fit_txt;
gr.SetTextRenderingHint(3);
// --- Default background colour
gr.FillSolidRect(0, 0, ww, wh, c1);
gr.FillGradRect(0, 0, ww, wh, 90, RGBA(255, 255, 255, 40), RGBA(255, 255, 255, 0));
// --- Top shadow
gr.FillGradRect(-20, 0, ww+40, 9, 90, RGBA(0,0,0,200), RGBA(0,0,0,0));
// --- Time elpased / total
var time_font = gdi.Font("segoe ui", 36, 1);
var time_w = gr.CalcTextWidth(((fb.IsPlaying)?g_playback_time:"0:00")+" / "+g_length, time_font)
var time_bg_colour = RGBA(0, 0, 0, 70);
var time_colour = RGBA(140, 200, 240, (250-g_timer_count*10));
gr.DrawString(((fb.IsPlaying)?g_playback_time:"0:00")+" / "+g_length, time_font, time_bg_colour, ww-time_w-10, 12, time_w, 32, r_stringformat);
gr.DrawString(((fb.IsPlaying)?g_playback_time:"0:00")+" / "+g_length, time_font, time_colour, ww-time_w-10, 10, time_w, 32, r_stringformat);
// --- Status Icon (Play/Pause/Stop)
if(fb.IsPlaying && !fb.IsPaused) {
gr.SetSmoothingMode(2);
var points1 = Array(10,19,26,26,10,33);
gr.FillPolygon(RGBA(0, 0, 0, 70), 0, points1);
var points2 = Array(10,17,26,24,10,31);
if(g_timer_count==0) {
gr.FillPolygon(RGBA(140, 200, 240, 250), 0, points2);
}
gr.SetSmoothingMode(0);
} else if(fb.IsPaused) {
gr.FillSolidRect(10, 19, 6, 14, RGBA(0, 0, 0, 70));
gr.FillSolidRect(10, 17, 6, 14, RGBA(140, 200, 240, 250));
if(g_timer_count==0) {
gr.FillSolidRect(20, 19, 6, 14, RGBA(0, 0, 0, 70));
gr.FillSolidRect(20, 17, 6, 14, RGBA(140, 200, 240, 250));
}
} else {
gr.FillSolidRect(10, 19, 16, 14, RGBA(0, 0, 0, 70));
if(g_timer_count==0) {
gr.FillSolidRect(10, 17, 16, 14, RGBA(140, 200, 240, 250));
}
}
// --- TRACK TITLE INFO
var title_default_font = gdi.Font("segoe ui", 20, 1);
var title_font = gdi.Font("segoe ui", (20+g_timer_count*5), 1);
var title_bg_colour = RGBA(0, 0, 0, 70);
var title_colour = RGBA(140, 200, 240, 250-g_timer_count*10);
fit_txt = "";
if(g_notify_info.title) {
for(i=0;i<g_notify_info.title.length;i++) {
fit_txt = fit_txt + g_notify_info.title.substring(i,i+1);
if(gr.CalcTextWidth(fit_txt, title_default_font)>(ww - 80 - time_w)) {
fit_txt = fit_txt + "...";
break;
}
}
}
gr.DrawString(fit_txt, title_default_font, title_bg_colour, 32, 10, (ww - 32 - time_w - 10), wh, lt_stringformat);
gr.DrawString(fit_txt, title_font, title_colour, 32-g_timer_count*3, 08-g_timer_count*05, (ww - 32 - time_w - 10)*g_timer_count, wh, lt_stringformat);
// --- ARTIST INFO
var artist_default_font = gdi.Font("segoe ui", 15, 1);
var artist_font = gdi.Font("segoe ui", (15+g_timer_count*5), 1);
var artist_bg_colour = RGBA(0, 0, 0, 70);
var artist_colour = RGBA(220, 240, 250, 250-g_timer_count*10);
fit_txt = "";
if(g_notify_info.artist) {
for(i=0;i<g_notify_info.artist.length;i++) {
fit_txt = fit_txt + g_notify_info.artist.substring(i,i+1);
if(gr.CalcTextWidth(fit_txt, artist_default_font)>(ww - 60 - time_w)) {
fit_txt = fit_txt + "...";
break;
}
}
}
gr.DrawString(fit_txt, artist_default_font, artist_bg_colour, 10, 44, (ww + 50), wh, lt_stringformat);
gr.DrawString(fit_txt, artist_font, artist_colour, 10+g_timer_count*3, 42-g_timer_count*1, (ww - 40)*g_timer_count, wh, lt_stringformat);
// --- ALBUM INFO
var album_default_font = gdi.Font("segoe ui", 13, 1);
var album_font = gdi.Font("segoe ui", (13+g_timer_count*4), 1);
var album_bg_colour = RGBA(0, 0, 0, 70);
var album_colour = RGBA(225, 155, 055, (250-g_timer_count*10));
fit_txt = "";
if(g_notify_info.album) {
var line = g_notify_info.date.length>0?g_notify_info.album+" - ["+g_notify_info.date+"]":g_notify_info.album;
for(i=0;i<line.length;i++) {
fit_txt = fit_txt + line.substring(i,i+1);
if(gr.CalcTextWidth(fit_txt, album_default_font)>(ww - 60 - time_w)) {
fit_txt = fit_txt + "...";
break;
}
}
}
gr.DrawString(fit_txt, album_default_font, album_bg_colour, 10, 71, (ww + 50), wh, lt_stringformat);
gr.DrawString(fit_txt, album_default_font, album_colour, 10, 69, (ww - 40), wh, lt_stringformat);
}
//=================================================// Playlist Callbacks
function on_playlists_changed() {
on_item_focus_change();
}
function on_playlist_switch() {
on_item_focus_change();
}
//=================================================// Mouse Callbacks
function on_mouse_lbtn_down(x, y) {
}
function on_mouse_lbtn_up(x, y) {
}
function on_mouse_rbtn_down(x, y) {
}
function on_mouse_rbtn_up(x, y) {
}
function on_mouse_move(x, y) {
}
//=================================================// Other Callbacks
function on_focus(is_focused) {
}
function on_timer(id) {
if(g_timer) {
if(g_timer.ID == id) {
g_timer_count-=2;
if(g_timer_count<=0) {
g_timer_count = 0;
window.KillTimer(g_timer);
}
window.Repaint();
}
}
}
//=================================================// Playback Callbacks
function on_playback_time(time) {
g_playback_time = tf_playback_time.Eval();
g_length = tf_length.Eval();
window.Repaint();
}
function on_playback_seek(time) {
on_item_focus_change();
}
function on_playback_new_track(info) {
g_timer && window.KillTimer(g_timer);
g_timer_count = 20;
g_timer = window.CreateTimerInterval(50);
on_item_focus_change();
}
function on_playback_pause() {
window.Repaint();
}
function on_playback_stop(reason) {
g_timer && window.KillTimer(g_timer);
on_item_focus_change();
}
//=================================================// MetaDB Callbacks
function on_item_focus_change() {
if(g_metadb) {
window.UnwatchMetadb();
}
// enforce TF_mode to Now playing regardless foobar preferences setting
g_metadb = (fb.IsPlaying||fb.IsPaused)?fb.GetNowPlaying():fb.GetFocusItem();
if(g_metadb) {
on_metadb_changed();
window.WatchMetadb(g_metadb);
}
}
function on_metadb_changed() {
g_playback_time = tf_playback_time.Eval();
g_length = tf_length.EvalWithMetadb(g_metadb);
g_notify_info.g_metadb = g_metadb;
g_notify_info.title = tf_title.EvalWithMetadb(g_metadb);
g_notify_info.artist = tf_artist.EvalWithMetadb(g_metadb);
g_notify_info.album = tf_album.EvalWithMetadb(g_metadb);
g_notify_info.date = tf_date.EvalWithMetadb(g_metadb);
window.Repaint();
}