Rockbox General > Rockbox General Discussion

Anyone still scrobbling in 2022?

<< < (3/4) > >>

Bilgus:
doomsquirrel here is a build with some polling of the USB status after the initial connection
ATM i'm thinking we are missing the notifications but it might be that they never get sent

--- Code: ---static void poll_usb_wait_for_disconnect(struct event_queue *q)
{
    struct queue_event ev;
    while(rb->usb_inserted() == true)
    {
        rb->queue_wait_w_tmo(q, &ev, HZ);
        int id = ev.id;
        if (id == SYS_POWEROFF || id == SYS_REBOOT || id == SYS_USB_DISCONNECTED)
        {
            rb->queue_post(q, ev.id, ev.data); /* repost */
            return;
        }
    }
    rb->queue_post(q, SYS_USB_DISCONNECTED, 0); /* we missed the disconnect ?? */
}

--- End code ---

baremetal mips:
https://www.mediafire.com/file/86d44osh61ql1pq/FioM3kBaremetal_scrobbler.zip

Or are you using the hosted port??
hosted:
http://www.mediafire.com/file/3psu8ojpp6knm47/FioM3kHosted_scrobbler.zip

first verify which port you are using (rockbox-info.txt CPU: hosted or CPU: mips)
unzip to your device after renaming the current .rockbox directory as a backup



doomsquirrel:
That seems to have fixed it.

Now, after I unplug the USB, it writes the track info to scrobbler.log.

There is a situation where it didn't write the track info to scrobbler.log. This happens when it resumes play on a track that is the last track it has written into scrobbler.log. I'm assuming this is so that it doesn't write the same track too many times when you stop playing (and the device powers down) in the middle of a track. If this is intentional, I'm happy about it. I always wanted this to be the behavior, instead of having to manually remove duplicates in the scrobbler.log file or in last.fm.

I'm using the baremetal mips port

P.S. Would it be possible to have the device resume playback after the [lastfm_scrobbler] plugin is started from the Start Screen? Maybe a setting somewhere to enable such behavior? This is not a major issue, but I would like it the most if the device automatically resumes playback when powered on (and after starting the [lastfm_scrobbler] plugin)

Bilgus:
I have been toying with making the TSR plugins persistent but I haven't decided how yet

EDIT , oh I see you meant start playback that shouldn't be too difficult but I'm not going to have time for it for a while

yes it tries not to write the same track 2x..

I'm not sure what is actually going on with the USB events, maybe it will become apparent once
dhugas' issue is figured out

 

amachronic:
bilgus, re IRC yesterday, I'm not sure why usb events wouldn't be propagated. It seems to be working for me but maybe my testing is too simple. This is what I did (with a clean RB install):

1. start up scrobbler and play a few tracks
2. plug in USB, I can see the tracks in the scrobbler log
3. unplug USB and play a few more tracks
4. plug in USB again, new tracks show up in scrobbler log

I added a USB TSR test plugin g#4555 to debug connection issues but it seems to be getting both connect & disconnect as expected.

doomsquirrel if you can think of any more specific thing I can try to trigger the bug i'd appreciate it.

Bilgus:
It tests the same for me..
amachronic I added a foreground mode so we can test both


--- Code: ---/***************************************************************************
 *             __________               __   ___.
 *   Open      \______   \ ____   ____ |  | _\_ |__   _______  ___
 *   Source     |       _//  _ \_/ ___\|  |/ /| __ \ /  _ \  \/  /
 *   Jukebox    |    |   (  <_> )  \___|    < | \_\ (  <_> > <  <
 *   Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \
 *                     \/            \/     \/    \/            \/
 * $Id$
 *
 * Copyright (C) 2022 Aidan MacDonald
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
 * KIND, either express or implied.
 *
 ****************************************************************************/

#include "plugin.h"
#include "logf.h"

#undef DEBUGF
#define DEBUGF(...)
//#define DEBUGF printf

#define EV_EXIT MAKE_SYS_EVENT(SYS_EVENT_CLS_PRIVATE, 0xFF)

unsigned char stack[DEFAULT_STACK_SIZE];
struct event_queue queue;
int thread_id;
const char* state = "none";
const char* prev_state = "none";

static void main_loop(void)
{
    bool exiting = false;
    struct queue_event ev;

    while(true) {
        rb->queue_wait(&queue, &ev);

        /* events that are handled whether exiting or not */
        switch(ev.id) {
        case EV_EXIT:
            return;
        }

        if(exiting)
            continue;

        /* events handled only when not exiting */
        switch(ev.id) {
        case SYS_USB_CONNECTED:
            prev_state = state;
            state = "connected";
            logf("test_usb: connect ack %ld", *rb->current_tick);
            DEBUGF("test_usb: connect ack %ld\n", *rb->current_tick);
            rb->usb_acknowledge(SYS_USB_CONNECTED_ACK);
            break;

        case SYS_USB_DISCONNECTED:
            prev_state = state;
            state = "disconnected";
            logf("test_usb: disconnect %ld", *rb->current_tick);
            DEBUGF("test_usb: disconnect %ld\n", *rb->current_tick);
            break;

        case SYS_POWEROFF:
        case SYS_REBOOT:
            prev_state = state;
            state = "exiting";
            exiting = true;
            break;
        }
    }
}

static void kill_tsr(void)
{
    rb->queue_post(&queue, EV_EXIT, 0);
    rb->thread_wait(thread_id);
    rb->queue_delete(&queue);
}

static bool exit_tsr(bool reenter)
{
    MENUITEM_STRINGLIST(menu, "USB test menu", NULL,
                        "Status", "Stop plugin", "Back");

    while(true) {
        int result = reenter ? rb->do_menu(&menu, NULL, NULL, false) : 1;
        switch(result) {
        case 0:
            rb->splashf(HZ, "State: %s", state);
            rb->splashf(HZ, "Prev: %s", prev_state);
            break;
        case 1:
            rb->splashf(HZ, "Stopping USB test thread");
            kill_tsr();
            return true;
        case 2:
            return false;
        }
    }
}

static void run_fg(void)
{
    rb->queue_init(&queue, true);
    thread_id = rb->create_thread(main_loop, stack, sizeof(stack),
                                  0, "test_usb"
                                  IF_PRIO(, PRIORITY_USER_INTERFACE)
                                  IF_COP(, CPU));
    rb->splashf(HZ, "Thread started");

    while(true)
    {
        if (rb->button_get_w_tmo(HZ) != BUTTON_NONE)
        {
            kill_tsr();
            rb->splashf(HZ, "Thread Exiting");
            return;
        }
    }
}

static void run_tsr(void)
{
    rb->queue_init(&queue, true);
    thread_id = rb->create_thread(main_loop, stack, sizeof(stack),
                                  0, "test_usb TSR"
                                  IF_PRIO(, PRIORITY_BACKGROUND)
                                  IF_COP(, CPU));
    rb->plugin_tsr(exit_tsr);
}

enum plugin_status plugin_start(const void* parameter)
{
    (void)parameter;
    MENUITEM_STRINGLIST(menu, "USB test menu", NULL,
                        "Start TSR", "Start Foreground", "Quit");
    while(true) {
        switch(rb->do_menu(&menu, NULL, NULL, false)) {
        case 0:
            run_tsr();
            rb->splashf(HZ, "Thread started");
            return PLUGIN_OK;
        case 1:
            run_fg();
            continue;
        case 2:
            return PLUGIN_OK;
        default:
            return PLUGIN_ERROR;
        }
    }
}


--- End code ---

doomsquirrel here is a build with the test plugin if you could test both the TSR and fg mode with your Fio
https://www.mediafire.com/file/bbq07r2nj8lpcxe/rockbox_TestUSB_FioM3k_bm.zip/file

Navigation

[0] Message Index

[#] Next page

[*] Previous page

Go to full version