forked from len0rd/rockbox
Display bitrate (Q value for Archos), samplerate, channels and recording format (M = MP3) in the statusbar in the recording screen. This is all new info for archos targets and I-river targets now have this info on the remote as well as the main screen
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@10856 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
ee88a3bb2c
commit
617b67e769
8 changed files with 225 additions and 65 deletions
|
|
@ -36,7 +36,9 @@
|
|||
#include "status.h" /* needed for battery_state global var */
|
||||
#include "action.h" /* for keys_locked */
|
||||
#include "statusbar.h"
|
||||
|
||||
#ifdef HAVE_RECORDING
|
||||
#include "audio.h"
|
||||
#endif
|
||||
|
||||
/* FIXME: should be removed from icon.h to avoid redefinition,
|
||||
but still needed for compatibility with old system */
|
||||
|
|
@ -52,6 +54,11 @@
|
|||
STATUSBAR_PLUG_WIDTH + \
|
||||
2*ICONS_SPACING
|
||||
#define STATUSBAR_VOLUME_WIDTH 16
|
||||
#define STATUSBAR_ENCODER_X_POS STATUSBAR_X_POS + \
|
||||
STATUSBAR_BATTERY_WIDTH + \
|
||||
STATUSBAR_PLUG_WIDTH + \
|
||||
2*ICONS_SPACING - 1
|
||||
#define STATUSBAR_ENCODER_WIDTH 18
|
||||
#define STATUSBAR_PLAY_STATE_X_POS STATUSBAR_X_POS + \
|
||||
STATUSBAR_BATTERY_WIDTH + \
|
||||
STATUSBAR_PLUG_WIDTH + \
|
||||
|
|
@ -65,6 +72,21 @@
|
|||
STATUSBAR_PLAY_STATE_WIDTH + \
|
||||
4*ICONS_SPACING
|
||||
#define STATUSBAR_PLAY_MODE_WIDTH 7
|
||||
#define STATUSBAR_RECFREQ_X_POS STATUSBAR_X_POS + \
|
||||
STATUSBAR_BATTERY_WIDTH + \
|
||||
STATUSBAR_PLUG_WIDTH + \
|
||||
STATUSBAR_VOLUME_WIDTH + \
|
||||
STATUSBAR_PLAY_STATE_WIDTH + \
|
||||
3*ICONS_SPACING
|
||||
#define STATUSBAR_RECFREQ_WIDTH 12
|
||||
#define STATUSBAR_RECCHANNELS_X_POS STATUSBAR_X_POS + \
|
||||
STATUSBAR_BATTERY_WIDTH + \
|
||||
STATUSBAR_PLUG_WIDTH + \
|
||||
STATUSBAR_VOLUME_WIDTH + \
|
||||
STATUSBAR_PLAY_STATE_WIDTH + \
|
||||
STATUSBAR_RECFREQ_WIDTH + \
|
||||
4*ICONS_SPACING
|
||||
#define STATUSBAR_RECCHANNELS_WIDTH 5
|
||||
#define STATUSBAR_SHUFFLE_X_POS STATUSBAR_X_POS + \
|
||||
STATUSBAR_BATTERY_WIDTH + \
|
||||
STATUSBAR_PLUG_WIDTH + \
|
||||
|
|
@ -102,6 +124,18 @@
|
|||
#endif
|
||||
#define STATUSBAR_TIME_X_END(statusbar_width) statusbar_width - 1 - \
|
||||
STATUSBAR_DISK_WIDTH
|
||||
#if defined(HAVE_RECORDING)
|
||||
/* analogue frequency numbers taken from the order of frequencies in sample_rate */
|
||||
#define FREQ_44 7
|
||||
#define FREQ_48 8
|
||||
#define FREQ_32 6
|
||||
#define FREQ_22 4
|
||||
#define FREQ_24 5
|
||||
#define FREQ_16 3
|
||||
#ifdef HAVE_SPDIF_IN
|
||||
#define SOURCE_SPDIF 2
|
||||
#endif
|
||||
#endif
|
||||
|
||||
struct gui_syncstatusbar statusbars;
|
||||
|
||||
|
|
@ -234,28 +268,40 @@ void gui_statusbar_draw(struct gui_statusbar * bar, bool force_redraw)
|
|||
STATUSBAR_Y_POS, STATUSBAR_PLUG_WIDTH,
|
||||
STATUSBAR_HEIGHT);
|
||||
#endif
|
||||
|
||||
bar->redraw_volume = gui_statusbar_icon_volume(bar, bar->info.volume);
|
||||
#ifdef HAVE_RECORDING
|
||||
/* turn off volume display in recording screen */
|
||||
if (!global_settings.recscreen_on)
|
||||
#endif
|
||||
bar->redraw_volume = gui_statusbar_icon_volume(bar, bar->info.volume);
|
||||
gui_statusbar_icon_play_state(display, current_playmode() + Icon_Play);
|
||||
|
||||
switch (bar->info.repeat) {
|
||||
|
||||
#ifdef HAVE_RECORDING
|
||||
/* If in recording screen, replace repeat mode, volume
|
||||
and shuffle icons with recording info */
|
||||
if (global_settings.recscreen_on)
|
||||
gui_statusbar_icon_recording_info(display);
|
||||
else
|
||||
#endif
|
||||
{
|
||||
switch (bar->info.repeat) {
|
||||
#if (AB_REPEAT_ENABLE == 1)
|
||||
case REPEAT_AB:
|
||||
gui_statusbar_icon_play_mode(display, Icon_RepeatAB);
|
||||
break;
|
||||
case REPEAT_AB:
|
||||
gui_statusbar_icon_play_mode(display, Icon_RepeatAB);
|
||||
break;
|
||||
#endif /* AB_REPEAT_ENABLE == 1 */
|
||||
|
||||
case REPEAT_ONE:
|
||||
gui_statusbar_icon_play_mode(display, Icon_RepeatOne);
|
||||
break;
|
||||
case REPEAT_ONE:
|
||||
gui_statusbar_icon_play_mode(display, Icon_RepeatOne);
|
||||
break;
|
||||
|
||||
case REPEAT_ALL:
|
||||
case REPEAT_SHUFFLE:
|
||||
gui_statusbar_icon_play_mode(display, Icon_Repeat);
|
||||
break;
|
||||
case REPEAT_ALL:
|
||||
case REPEAT_SHUFFLE:
|
||||
gui_statusbar_icon_play_mode(display, Icon_Repeat);
|
||||
break;
|
||||
}
|
||||
if (bar->info.shuffle)
|
||||
gui_statusbar_icon_shuffle(display);
|
||||
}
|
||||
if (bar->info.shuffle)
|
||||
gui_statusbar_icon_shuffle(display);
|
||||
if (bar->info.keylock)
|
||||
gui_statusbar_icon_lock(display);
|
||||
#ifdef HAS_REMOTE_BUTTON_HOLD
|
||||
|
|
@ -553,6 +599,115 @@ void gui_statusbar_time(struct screen * display, int hour, int minute)
|
|||
}
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_RECORDING
|
||||
void gui_statusbar_icon_recording_info(struct screen * display)
|
||||
{
|
||||
int width, height;
|
||||
char buffer[4];
|
||||
char* const sample_rate[12] =
|
||||
{
|
||||
"8",
|
||||
"11",
|
||||
"12",
|
||||
"16",
|
||||
"22",
|
||||
"24",
|
||||
"32",
|
||||
"44",
|
||||
"48",
|
||||
"64",
|
||||
"88",
|
||||
"96"
|
||||
};
|
||||
#if CONFIG_CODEC != SWCODEC
|
||||
char* const bit_rate[9] =
|
||||
{
|
||||
"MQ0",
|
||||
"MQ1",
|
||||
"MQ2",
|
||||
"MQ3",
|
||||
"MQ4",
|
||||
"MQ5",
|
||||
"MQ6",
|
||||
"MQ7",
|
||||
"WAV"
|
||||
};
|
||||
#endif
|
||||
|
||||
display->setfont(FONT_SYSFIXED);
|
||||
|
||||
/* Display Codec info in statusbar */
|
||||
#if CONFIG_CODEC == SWCODEC
|
||||
/* Can't fit info for sw codec targets in statusbar using FONT_SYSFIXED
|
||||
so must use icons */
|
||||
display->mono_bitmap(bitmap_icons_18x8[global_settings.rec_quality],
|
||||
STATUSBAR_ENCODER_X_POS, STATUSBAR_Y_POS,
|
||||
STATUSBAR_ENCODER_WIDTH, STATUSBAR_HEIGHT);
|
||||
#else
|
||||
snprintf(buffer, sizeof(buffer), "%s", bit_rate[global_settings.rec_quality]);
|
||||
display->getstringsize(buffer, &width, &height);
|
||||
if (height <= STATUSBAR_HEIGHT)
|
||||
{
|
||||
display->putsxy(STATUSBAR_ENCODER_X_POS, STATUSBAR_Y_POS, buffer);
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Display Samplerate info in statusbar */
|
||||
#if defined(HAVE_SPDIF_IN)
|
||||
if (global_settings.rec_source == SOURCE_SPDIF)
|
||||
{
|
||||
#if (CONFIG_CODEC != MAS3587F) && !defined(SIMULATOR)
|
||||
snprintf(buffer, sizeof(buffer), "%s", sample_rate[audio_get_spdif_sample_rate()]);
|
||||
#else
|
||||
/* Can't measure S/PDIF sample rate on Archos/Sim yet so just display input type */
|
||||
snprintf(buffer, sizeof(buffer), "Dg");
|
||||
#endif
|
||||
}
|
||||
else
|
||||
#endif /* HAVE_SPDIF_IN */
|
||||
{
|
||||
/* Analogue frequency in wrong order so remap settings numbers */
|
||||
int freq = global_settings.rec_frequency;
|
||||
if (freq == 0)
|
||||
freq = FREQ_44;
|
||||
else if (freq == 1)
|
||||
freq = FREQ_48;
|
||||
else if (freq == 2)
|
||||
freq = FREQ_32;
|
||||
else if (freq == 3)
|
||||
freq = FREQ_22;
|
||||
else if (freq == 4)
|
||||
freq = FREQ_24;
|
||||
else if (freq == 5)
|
||||
freq = FREQ_16;
|
||||
|
||||
snprintf(buffer, sizeof(buffer), "%s", sample_rate[freq]);
|
||||
}
|
||||
|
||||
display->getstringsize(buffer, &width, &height);
|
||||
if (height <= STATUSBAR_HEIGHT)
|
||||
{
|
||||
display->putsxy(STATUSBAR_RECFREQ_X_POS, STATUSBAR_Y_POS, buffer);
|
||||
}
|
||||
|
||||
display->setfont(FONT_UI);
|
||||
|
||||
/* Display Channel status in status bar */
|
||||
if(global_settings.rec_channels)
|
||||
{
|
||||
display->mono_bitmap(bitmap_icons_5x8[Icon_Mono],
|
||||
STATUSBAR_RECCHANNELS_X_POS , STATUSBAR_Y_POS,
|
||||
STATUSBAR_RECCHANNELS_WIDTH, STATUSBAR_HEIGHT);
|
||||
}
|
||||
else
|
||||
{
|
||||
display->mono_bitmap(bitmap_icons_5x8[Icon_Stereo],
|
||||
STATUSBAR_RECCHANNELS_X_POS, STATUSBAR_Y_POS,
|
||||
STATUSBAR_RECCHANNELS_WIDTH, STATUSBAR_HEIGHT);
|
||||
}
|
||||
}
|
||||
#endif /* HAVE_RECORDING */
|
||||
|
||||
#endif /* HAVE_LCD_BITMAP */
|
||||
|
||||
void gui_syncstatusbar_init(struct gui_syncstatusbar * bars)
|
||||
|
|
|
|||
|
|
@ -105,7 +105,9 @@ void gui_statusbar_icon_shuffle(struct screen * display);
|
|||
void gui_statusbar_icon_lock(struct screen * display);
|
||||
void gui_statusbar_icon_lock_remote(struct screen * display);
|
||||
void gui_statusbar_led(struct screen * display);
|
||||
|
||||
#ifdef HAVE_RECORDING
|
||||
void gui_statusbar_icon_recording_info(struct screen * display);
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_RTC
|
||||
void gui_statusbar_time(struct screen * display, int hour, int minute);
|
||||
|
|
|
|||
|
|
@ -31,7 +31,9 @@
|
|||
const unsigned char bitmap_icons_5x8[][5] =
|
||||
{
|
||||
[Icon_Lock_Main] ={0x78,0x7f,0x49,0x7f,0x78}, /* Lock Main */
|
||||
[Icon_Lock_Remote]={0x78,0x7f,0x49,0x7f,0x78} /* Lock Remote */
|
||||
[Icon_Lock_Remote]={0x78,0x7f,0x49,0x7f,0x78}, /* Lock Remote */
|
||||
[Icon_Stereo]={0x1c, 0x22, 0x1c, 0x22, 0x1c}, /* Stereo recording */
|
||||
[Icon_Mono]={0x00, 0x1c, 0x22, 0x1c, 0x00} /* Mono recording */
|
||||
};
|
||||
|
||||
const unsigned char bitmap_icons_6x8[][6] =
|
||||
|
|
@ -75,6 +77,29 @@ const unsigned char bitmap_icons_7x8[][7] =
|
|||
{0x7f,0x04,0x4e,0x5f,0x44,0x38,0x7f} /* Repeat-AB playmode */
|
||||
};
|
||||
|
||||
const unsigned char bitmap_icons_18x8[][18] =
|
||||
{
|
||||
{0x00, 0x00, 0x00, 0x00, 0x3e, 0x04, 0x08, 0x04, 0x3e, 0x00, 0x00, 0x1c, 0x2a,
|
||||
0x12, 0x00, 0x1e, 0x30, 0x10}, /* mp3 64kbps */
|
||||
{0x00, 0x00, 0x00, 0x00, 0x3e, 0x04, 0x08, 0x04, 0x3e, 0x00, 0x00, 0x04, 0x0a,
|
||||
0x3e, 0x00, 0x1c, 0x2a, 0x12}, /* mp3 96kbps */
|
||||
{0x00, 0x00, 0x3e, 0x04, 0x08, 0x04, 0x3e, 0x00, 0x00, 0x3e, 0x00, 0x32, 0x2a,
|
||||
0x24, 0x00, 0x14, 0x2a, 0x14}, /* mp3 128kbps */
|
||||
{0x00, 0x00, 0x3e, 0x04, 0x08, 0x04, 0x3e, 0x00, 0x00, 0x3e, 0x00, 0x1c, 0x2a,
|
||||
0x12, 0x00, 0x1c, 0x22, 0x1c}, /* mp3 160kbps */
|
||||
{0x00, 0x00, 0x3e, 0x04, 0x08, 0x04, 0x3e, 0x00, 0x00, 0x3e, 0x00, 0x04, 0x0a,
|
||||
0x3e, 0x00, 0x32, 0x2a, 0x24}, /* mp3 192kbps */
|
||||
{0x3e, 0x04, 0x08, 0x04, 0x3e, 0x00, 0x00, 0x32, 0x2a, 0x24, 0x00, 0x32, 0x2a,
|
||||
0x24, 0x00, 0x1e, 0x30, 0x10}, /* mp3 224kbps */
|
||||
{0x3e, 0x04, 0x08, 0x04, 0x3e, 0x00, 0x00, 0x22, 0x2a, 0x14, 0x00, 0x32, 0x2a,
|
||||
0x24, 0x00, 0x1c, 0x22, 0x1c}, /* mp3 320kbps */
|
||||
{0x00, 0x00, 0x00, 0x00, 0x1e, 0x20, 0x18, 0x20, 0x1e, 0x00, 0x1e, 0x20, 0x18,
|
||||
0x06, 0x00, 0x00, 0x00, 0x00}, /* wv */
|
||||
{0x00, 0x1e, 0x20, 0x18, 0x20, 0x1e, 0x00, 0x3c, 0x12, 0x12, 0x3c, 0x00, 0x1e,
|
||||
0x20, 0x18, 0x06, 0x00, 0x00} /* wav */
|
||||
};
|
||||
|
||||
|
||||
/* Disk/MMC activity */
|
||||
const unsigned char bitmap_icon_disk[12] =
|
||||
#ifdef HAVE_MMC
|
||||
|
|
|
|||
|
|
@ -39,6 +39,8 @@
|
|||
enum icons_5x8 {
|
||||
Icon_Lock_Main,
|
||||
Icon_Lock_Remote,
|
||||
Icon_Stereo,
|
||||
Icon_Mono,
|
||||
Icon5x8Last
|
||||
};
|
||||
|
||||
|
|
@ -83,9 +85,22 @@ enum icons_7x8 {
|
|||
Icon7x8Last
|
||||
};
|
||||
|
||||
enum icons_18x8 {
|
||||
Icon_mp364,
|
||||
Icon_mp396,
|
||||
Icon_mp3128,
|
||||
Icon_mp3160,
|
||||
Icon_mp3192,
|
||||
Icon_mp3224,
|
||||
Icon_mp3320,
|
||||
Icon_wv,
|
||||
Icon_wav,
|
||||
Icon18x8Last
|
||||
};
|
||||
extern const unsigned char bitmap_icons_5x8[Icon5x8Last][5];
|
||||
extern const unsigned char bitmap_icons_6x8[Icon6x8Last][6];
|
||||
extern const unsigned char bitmap_icons_7x8[Icon7x8Last][7];
|
||||
extern const unsigned char bitmap_icons_18x8[Icon18x8Last][18];
|
||||
extern const unsigned char bitmap_icon_disk[];
|
||||
|
||||
#define STATUSBAR_X_POS 0
|
||||
|
|
|
|||
|
|
@ -810,6 +810,7 @@ bool recording_screen(bool no_source)
|
|||
ID2P(LANG_GIGABYTE)
|
||||
};
|
||||
|
||||
global_settings.recscreen_on = true;
|
||||
cursor = 0;
|
||||
#if (CONFIG_LED == LED_REAL) && !defined(SIMULATOR)
|
||||
ata_set_led_enabled(false);
|
||||
|
|
@ -1353,7 +1354,6 @@ bool recording_screen(bool no_source)
|
|||
unsigned int dseconds, dhours, dminutes;
|
||||
unsigned long num_recorded_bytes, dsize, dmb;
|
||||
int pos = 0;
|
||||
char spdif_sfreq[8];
|
||||
|
||||
update_countdown = 5;
|
||||
last_seconds = seconds;
|
||||
|
|
@ -1687,53 +1687,11 @@ bool recording_screen(bool no_source)
|
|||
PM_HEIGHT + 2, true);
|
||||
}
|
||||
}
|
||||
/* Can't measure S/PDIF sample rate on Archos yet */
|
||||
#if (CONFIG_CODEC != MAS3587F) && defined(HAVE_SPDIF_IN) && !defined(SIMULATOR)
|
||||
if (global_settings.rec_source == AUDIO_SRC_SPDIF)
|
||||
snprintf(spdif_sfreq, 8, "%dHz", audio_get_spdif_sample_rate());
|
||||
#else
|
||||
(void)spdif_sfreq;
|
||||
#endif
|
||||
snprintf(buf, 32, "%s %s",
|
||||
#if (CONFIG_CODEC != MAS3587F) && defined(HAVE_SPDIF_IN) && !defined(SIMULATOR)
|
||||
global_settings.rec_source == AUDIO_SRC_SPDIF ?
|
||||
spdif_sfreq :
|
||||
#endif
|
||||
freq_str[global_settings.rec_frequency],
|
||||
global_settings.rec_channels ?
|
||||
str(LANG_SYSFONT_CHANNEL_MONO) :
|
||||
str(LANG_SYSFONT_CHANNEL_STEREO));
|
||||
|
||||
for(i = 0; i < screen_update; i++) {
|
||||
#ifdef HAVE_AGC
|
||||
if ((global_settings.rec_source == AUDIO_SRC_MIC)
|
||||
|| (global_settings.rec_source == AUDIO_SRC_LINEIN)
|
||||
|| (global_settings.rec_source == AUDIO_SRC_FMRADIO))
|
||||
screens[i].puts(0, filename_offset[i] + PM_HEIGHT + line[i] + 1, buf);
|
||||
else
|
||||
#endif
|
||||
screens[i].puts(0, filename_offset[i] + PM_HEIGHT + line[i], buf);
|
||||
}
|
||||
|
||||
#ifdef HAVE_AGC
|
||||
hist_time++;
|
||||
#endif
|
||||
|
||||
#if CONFIG_CODEC == SWCODEC
|
||||
snprintf(buf, 32, "%s",
|
||||
REC_QUALITY_LABEL(global_settings.rec_quality));
|
||||
for(i = 0; i < screen_update; i++){
|
||||
#ifdef HAVE_AGC
|
||||
if ((global_settings.rec_source == AUDIO_SRC_MIC)
|
||||
|| (global_settings.rec_source == AUDIO_SRC_LINEIN)
|
||||
|| (global_settings.rec_source == AUDIO_SRC_FMRADIO))
|
||||
screens[i].puts(0, filename_offset[i] + PM_HEIGHT + line[i] + 2, buf);
|
||||
else
|
||||
#endif
|
||||
screens[i].puts(0, filename_offset[i] + PM_HEIGHT + line[i] + 1, buf);
|
||||
}
|
||||
#endif
|
||||
|
||||
for(i = 0; i < screen_update; i++)
|
||||
{
|
||||
gui_statusbar_draw(&(statusbars.statusbars[i]), true);
|
||||
|
|
@ -1758,7 +1716,6 @@ bool recording_screen(bool no_source)
|
|||
}
|
||||
} /* end while(!done) */
|
||||
|
||||
|
||||
#if CONFIG_CODEC == SWCODEC
|
||||
audio_stat = pcm_rec_status();
|
||||
#else
|
||||
|
|
@ -1806,6 +1763,7 @@ bool recording_screen(bool no_source)
|
|||
peak_meter_trigger(false);
|
||||
peak_meter_set_trigger_listener(NULL);
|
||||
|
||||
global_settings.recscreen_on = false;
|
||||
sound_settings_apply();
|
||||
|
||||
FOR_NB_SCREENS(i)
|
||||
|
|
|
|||
|
|
@ -92,7 +92,7 @@ const char rec_base_directory[] = REC_BASE_DIR;
|
|||
#include "dsp.h"
|
||||
#endif
|
||||
|
||||
#define CONFIG_BLOCK_VERSION 51
|
||||
#define CONFIG_BLOCK_VERSION 52
|
||||
#define CONFIG_BLOCK_SIZE 512
|
||||
#define RTC_BLOCK_SIZE 44
|
||||
|
||||
|
|
@ -464,6 +464,7 @@ static const struct bit_entry hd_bits[] =
|
|||
|
||||
#ifdef HAVE_RECORDING
|
||||
/* recording */
|
||||
{1, S_O(recscreen_on), false, "recscreen on", off_on },
|
||||
{1, S_O(rec_startup), false, "rec screen on startup", off_on },
|
||||
{4, S_O(rec_timesplit), 0, "rec timesplit", /* 0...15 */
|
||||
"off,00:05,00:10,00:15,00:30,01:00,01:14,01:20,02:00,04:00,06:00,08:00,10:00,12:00,18:00,24:00" },
|
||||
|
|
@ -1336,6 +1337,9 @@ void settings_load(int which)
|
|||
RTC_BLOCK_SIZE*8);
|
||||
}
|
||||
|
||||
#ifdef HAVE_RECORDING
|
||||
global_settings.recscreen_on = false;
|
||||
#endif
|
||||
#ifdef HAVE_LCD_CONTRAST
|
||||
if ( global_settings.contrast < MIN_CONTRAST_SETTING )
|
||||
global_settings.contrast = lcd_default_contrast();
|
||||
|
|
|
|||
|
|
@ -151,6 +151,7 @@ struct user_settings
|
|||
int rec_left_gain; /* 0-15 */
|
||||
int rec_right_gain; /* 0-15 */
|
||||
bool rec_editable; /* true means that the bit reservoir is off */
|
||||
bool recscreen_on; /* true if using the recording screen */
|
||||
|
||||
/* note: timesplit setting is not saved */
|
||||
int rec_timesplit; /* 0 = off,
|
||||
|
|
|
|||
|
|
@ -289,7 +289,7 @@ unsigned long audio_get_spdif_sample_rate(void)
|
|||
|
||||
if (diff2 > diff1) --i;
|
||||
}
|
||||
return spdif_sample_rates[i];
|
||||
return i;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue