1
0
Fork 0
forked from len0rd/rockbox

Playback logging add Start time and rename when log size exceeds 512k

renames to playback_nnnn.log

you won't get the message when first enabling logging since it
happens at start-up..

Change-Id: I58ca65a48deff7c5bb1f93c3d86d9ee9e19f3f2e
This commit is contained in:
William Wilgus 2025-02-16 20:05:52 -05:00 committed by William Wilgus
parent 64d8fc7c0c
commit 731f3fd8be
2 changed files with 64 additions and 16 deletions

View file

@ -22,6 +22,7 @@
****************************************************************************/ ****************************************************************************/
#include "config.h" #include "config.h"
#include "system.h" #include "system.h"
#include "version.h"
#include "kernel.h" #include "kernel.h"
#include "panic.h" #include "panic.h"
#include "core_alloc.h" #include "core_alloc.h"
@ -45,7 +46,7 @@
#include "misc.h" #include "misc.h"
#include "settings.h" #include "settings.h"
#include "audiohw.h" #include "audiohw.h"
#include "general.h"
#include <stdio.h> #include <stdio.h>
#ifdef HAVE_TAGCACHE #ifdef HAVE_TAGCACHE
@ -348,6 +349,9 @@ static int codec_skip_status;
static bool codec_seeking = false; /* Codec seeking ack expected? */ static bool codec_seeking = false; /* Codec seeking ack expected? */
static unsigned int position_key = 0; static unsigned int position_key = 0;
#define PLAYBACK_LOG_PATH ROCKBOX_DIR "/playback.log"
#define PLAYBACK_LOG_MAX_FILESZ_BYTES (511 << 10) /* 512k approx 1000-2500 tracks */
#define PLAYBACK_LOG_MIN_ELAPSED_MS (500) /* 500 milliseconds */
#if (CONFIG_STORAGE & STORAGE_ATA) #if (CONFIG_STORAGE & STORAGE_ATA)
#define PLAYBACK_LOG_BUFSZ (MAX_PATH * 10) #define PLAYBACK_LOG_BUFSZ (MAX_PATH * 10)
static int playback_log_handle = 0; /* core_alloc handle for playback log buffer */ static int playback_log_handle = 0; /* core_alloc handle for playback log buffer */
@ -1239,8 +1243,14 @@ static void audio_handle_track_load_status(int trackstat)
void allocate_playback_log(void) INIT_ATTR; void allocate_playback_log(void) INIT_ATTR;
void allocate_playback_log(void) void allocate_playback_log(void)
{ {
int fd;
char filename[MAX_PATH];
if (!global_settings.playback_log)
return;
#if (CONFIG_STORAGE & STORAGE_ATA) #if (CONFIG_STORAGE & STORAGE_ATA)
if (global_settings.playback_log && playback_log_handle == 0) if (playback_log_handle == 0)
{ {
playback_log_handle = core_alloc(PLAYBACK_LOG_BUFSZ); playback_log_handle = core_alloc(PLAYBACK_LOG_BUFSZ);
if (playback_log_handle > 0) if (playback_log_handle > 0)
@ -1248,22 +1258,51 @@ void allocate_playback_log(void)
DEBUGF("%s Allocated %d bytes\n", __func__, PLAYBACK_LOG_BUFSZ); DEBUGF("%s Allocated %d bytes\n", __func__, PLAYBACK_LOG_BUFSZ);
char *buf = core_get_data(playback_log_handle); char *buf = core_get_data(playback_log_handle);
buf[0] = '\0'; buf[0] = '\0';
return;
} }
} }
#endif #endif
while (1)
{
DEBUGF("Opening %s \n", PLAYBACK_LOG_PATH);
fd = open(PLAYBACK_LOG_PATH, O_WRONLY|O_CREAT|O_APPEND, 0666);
if (fd >= 0)
{
/* check if the playback log is excessive */
if (lseek(fd, 0, SEEK_END) > PLAYBACK_LOG_MAX_FILESZ_BYTES)
{
close(fd);
create_numbered_filename(filename, ROCKBOX_DIR, "playback_",
".log", 4 IF_CNFN_NUM_(, NULL));
DEBUGF("Renaming %s => %s\n", PLAYBACK_LOG_PATH, filename);
if (rename(PLAYBACK_LOG_PATH, filename) < 0)
break; /*failure*/
continue;
}
else
{
#if CONFIG_RTC
create_datetime_filename(filename, "", " Time ", "", false);
fdprintf(fd, "# Started Ver. %s %s\n", rbversion, filename);
#else
fdprintf(fd, "# Started Ver. %s\n", rbversion);
#endif
}
close(fd);
}
break;
}
} }
void add_playbacklog(struct mp3entry *id3) void add_playbacklog(struct mp3entry *id3)
{ {
if (!global_settings.playback_log) if (!global_settings.playback_log)
return; return;
unsigned long timestamp = 0;
ssize_t used = 0; ssize_t used = 0;
unsigned long timestamp = current_tick * (1000 / HZ); /* milliseconds */
#if (CONFIG_STORAGE & STORAGE_ATA) #if (CONFIG_STORAGE & STORAGE_ATA)
ssize_t bufsz = 0;
char *buf = NULL; char *buf = NULL;
ssize_t bufsz;
/* if the user just enabled playback logging rather than stopping playback /* if the user just enabled playback logging rather than stopping playback
* to allocate a buffer or if buffer too large just flush direct to disk * to allocate a buffer or if buffer too large just flush direct to disk
* buffer will attempt to be allocated next start-up */ * buffer will attempt to be allocated next start-up */
@ -1271,15 +1310,20 @@ void add_playbacklog(struct mp3entry *id3)
{ {
buf = core_get_data(playback_log_handle); buf = core_get_data(playback_log_handle);
used = strlen(buf); used = strlen(buf);
bufsz = PLAYBACK_LOG_BUFSZ - used; if (used < PLAYBACK_LOG_BUFSZ)
buf += used; {
bufsz = PLAYBACK_LOG_BUFSZ - used;
buf += used;
}
DEBUGF("%s Used %lu Remain: %lu\n", __func__, used, bufsz); DEBUGF("%s Used %lu Remain: %lu\n", __func__, used, bufsz);
} }
#endif #endif
if (id3 && id3->elapsed > 500) /* 500 ms*/ if (id3 && id3->elapsed > PLAYBACK_LOG_MIN_ELAPSED_MS)
{ {
#if CONFIG_RTC #if CONFIG_RTC
timestamp = mktime(get_time()); timestamp = mktime(get_time());
#else
timestamp = current_tick * (1000 / HZ); /* milliseconds */
#endif #endif
#if (CONFIG_STORAGE & STORAGE_ATA) #if (CONFIG_STORAGE & STORAGE_ATA)
if (buf) /* we have a buffer allocd from core */ if (buf) /* we have a buffer allocd from core */
@ -1291,7 +1335,7 @@ void add_playbacklog(struct mp3entry *id3)
if (entrylen < bufsz) if (entrylen < bufsz)
{ {
DEBUGF("BUFFERED: time: %lu elapsed %ld/%ld saving file: %s\n", DEBUGF("BUFFERED: time: %lu elapsed %ld/%ld saving file: %s\n",
timestamp, id3->elapsed, id3->length, id3->path); timestamp, (long)id3->elapsed, (long)id3->length, id3->path);
return; /* succeed or snprintf fail return */ return; /* succeed or snprintf fail return */
} }
buf[0] = '\0'; buf[0] = '\0';
@ -1304,8 +1348,8 @@ void add_playbacklog(struct mp3entry *id3)
if (id3 || used > 0) /* flush */ if (id3 || used > 0) /* flush */
{ {
DEBUGF("Opening %s \n", ROCKBOX_DIR "/playback.log"); DEBUGF("Opening %s \n", PLAYBACK_LOG_PATH);
int fd = open(ROCKBOX_DIR "/playback.log", O_WRONLY|O_CREAT|O_APPEND, 0666); int fd = open(PLAYBACK_LOG_PATH, O_WRONLY|O_CREAT|O_APPEND, 0666);
if (fd < 0) if (fd < 0)
{ {
return; /* failure */ return; /* failure */
@ -1324,7 +1368,7 @@ void add_playbacklog(struct mp3entry *id3)
{ {
/* we have the timestamp from when we tried to add to buffer */ /* we have the timestamp from when we tried to add to buffer */
DEBUGF("LOGGED: time: %lu elapsed %ld/%ld saving file: %s\n", DEBUGF("LOGGED: time: %lu elapsed %ld/%ld saving file: %s\n",
timestamp, id3->elapsed, id3->length, id3->path); timestamp, (long)id3->elapsed, (long)id3->length, id3->path);
fdprintf(fd, "%lu:%ld:%ld:%s\n", fdprintf(fd, "%lu:%ld:%ld:%s\n",
timestamp, (long)id3->elapsed, (long)id3->length, id3->path); timestamp, (long)id3->elapsed, (long)id3->length, id3->path);
} }
@ -3115,7 +3159,7 @@ static void audio_stop_playback(void)
/* Go idle */ /* Go idle */
filling = STATE_IDLE; filling = STATE_IDLE;
cancel_cpu_boost(); cancel_cpu_boost();
add_playbacklog(NULL); add_playbacklog(NULL); /* flush playback log */
} }
/* Pause the playback of the current track /* Pause the playback of the current track

View file

@ -332,8 +332,12 @@ you to configure settings related to audio playback.
Devices without a Real Time Clock will use current system tick. Devices without a Real Time Clock will use current system tick.
Tracks played for a very short duration < 1 second will not be recorded Tracks played for a very short duration < 1 second will not be recorded
to minimize disk access while skipping quickly through songs. to minimize disk access while skipping quickly through songs.
You should periodically delete this log as excessive file sizes may cause
decreased device performace see \setting{LastFm Scrobbler} plugin. \note {When the device is started a comment will be written to the log,
devices with Real Time Clock will record the date and time as well.
When the log gets too large (\textasciitilde 1500 tracks) it will be split into playback\_nnnn.log
where nnnn is 0001-9999}
see \setting{LastFm Scrobbler} plugin.
\begin{verbatim} \begin{verbatim}
the log can be found under '/.rockbox/playback.log' the log can be found under '/.rockbox/playback.log'
\end{verbatim} \end{verbatim}