1 /***************************************************************************
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
10 * Copyright (C) 2002-2007 Björn Stenberg
11 * Copyright (C) 2007-2008 Nicolas Pennequin
13 * This program is free software; you can redistribute it and/or
14 * modify it under the terms of the GNU General Public License
15 * as published by the Free Software Foundation; either version 2
16 * of the License, or (at your option) any later version.
18 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
19 * KIND, either express or implied.
21 ****************************************************************************/
29 #include "settings_list.h"
30 #include "rbunicode.h"
31 #include "timefuncs.h"
34 #include "powermgmt.h"
37 #ifdef HAVE_LCD_CHARCELLS
44 #ifdef HAVE_LCD_BITMAP
50 #if CONFIG_CODEC == SWCODEC
56 #include "wps_internals.h"
57 #include "root_menu.h"
59 #include "recording.h"
60 #include "pcm_record.h"
65 extern struct wps_state wps_state
;
67 static char* get_codectype(const struct mp3entry
* id3
)
69 if (id3
&& id3
->codectype
< AFMT_NUM_CODECS
) {
70 return (char*)audio_formats
[id3
->codectype
].label
;
76 /* Extract a part from a path.
78 * buf - buffer extract part to.
79 * buf_size - size of buffer.
80 * path - path to extract from.
81 * level - what to extract. 0 is file name, 1 is parent of file, 2 is
82 * parent of parent, etc.
84 * Returns buf if the desired level was found, NULL otherwise.
86 char* get_dir(char* buf
, int buf_size
, const char* path
, int level
)
92 sep
= path
+ strlen(path
);
107 if (level
|| (last_sep
<= sep
))
110 len
= MIN(last_sep
- sep
, buf_size
- 1);
111 strlcpy(buf
, sep
+ 1, len
+ 1);
115 #if (CONFIG_CODEC != MAS3507D)
116 /* A helper to determine the enum value for pitch/speed.
118 When there are two choices (i.e. boolean), return 1 if the value is
119 different from normal value and 2 if the value is the same as the
120 normal value. E.g. "%?Sp<%Sp>" would show the pitch only when
121 playing at a modified pitch.
123 When there are more than two choices (i.e. enum), the left half of
124 the choices are to show 0..normal range, and the right half of the
125 choices are to show values over that. The last entry is used when
126 it is set to the normal setting, following the rockbox convention
127 to use the last entry for special values.
131 2 items: %?Sp<0..99 or 101..infinity|100>
132 3 items: %?Sp<0..99|101..infinity|100>
133 4 items: %?Sp<0..49|50..99|101..infinity|100>
134 5 items: %?Sp<0..49|50..99|101..149|150..infinity|100>
135 6 items: %?Sp<0..33|34..66|67..99|101..133|134..infinity|100>
136 7 items: %?Sp<0..33|34..66|67..99|101..133|134..167|167..infinity|100>
138 static int pitch_speed_enum(int range
, int32_t val
, int32_t normval
)
144 return (val
== normval
) + 1;
148 n
= (center
* val
) / normval
+ 1;
149 return (range
<= n
) ? (range
- 1) : n
;
154 /* All tokens which only need the info to return a value go in here */
155 const char *get_id3_token(struct wps_token
*token
, struct mp3entry
*id3
,
156 char *buf
, int buf_size
, int limit
, int *intval
)
158 struct wps_state
*state
= &wps_state
;
163 case WPS_TOKEN_METADATA_ARTIST
:
165 case WPS_TOKEN_METADATA_COMPOSER
:
166 return id3
->composer
;
167 case WPS_TOKEN_METADATA_ALBUM
:
169 case WPS_TOKEN_METADATA_ALBUM_ARTIST
:
170 return id3
->albumartist
;
171 case WPS_TOKEN_METADATA_GROUPING
:
172 return id3
->grouping
;
173 case WPS_TOKEN_METADATA_GENRE
:
174 return id3
->genre_string
;
175 case WPS_TOKEN_METADATA_DISC_NUMBER
:
176 if (id3
->disc_string
)
177 return id3
->disc_string
;
179 snprintf(buf
, buf_size
, "%d", id3
->discnum
);
183 case WPS_TOKEN_METADATA_TRACK_NUMBER
:
184 if (id3
->track_string
)
185 return id3
->track_string
;
187 snprintf(buf
, buf_size
, "%d", id3
->tracknum
);
191 case WPS_TOKEN_METADATA_TRACK_TITLE
:
193 case WPS_TOKEN_METADATA_VERSION
:
194 switch (id3
->id3version
)
210 case WPS_TOKEN_METADATA_YEAR
:
211 if( id3
->year_string
)
212 return id3
->year_string
;
214 snprintf(buf
, buf_size
, "%d", id3
->year
);
218 case WPS_TOKEN_METADATA_COMMENT
:
220 case WPS_TOKEN_FILE_PATH
:
222 case WPS_TOKEN_FILE_BITRATE
:
224 snprintf(buf
, buf_size
, "%d", id3
->bitrate
);
228 case WPS_TOKEN_TRACK_TIME_ELAPSED
:
229 format_time(buf
, buf_size
,
230 id3
->elapsed
+ state
->ff_rewind_count
);
233 case WPS_TOKEN_TRACK_TIME_REMAINING
:
234 format_time(buf
, buf_size
,
235 id3
->length
- id3
->elapsed
-
236 state
->ff_rewind_count
);
239 case WPS_TOKEN_TRACK_LENGTH
:
240 format_time(buf
, buf_size
, id3
->length
);
243 case WPS_TOKEN_TRACK_ELAPSED_PERCENT
:
244 if (id3
->length
<= 0)
249 *intval
= limit
* (id3
->elapsed
+ state
->ff_rewind_count
)
252 snprintf(buf
, buf_size
, "%d",
253 100*(id3
->elapsed
+ state
->ff_rewind_count
) / id3
->length
);
257 case WPS_TOKEN_FILE_CODEC
:
260 if(id3
->codectype
== AFMT_UNKNOWN
)
261 *intval
= AFMT_NUM_CODECS
;
263 *intval
= id3
->codectype
;
265 return get_codectype(id3
);
267 case WPS_TOKEN_FILE_FREQUENCY
:
268 snprintf(buf
, buf_size
, "%ld", id3
->frequency
);
270 case WPS_TOKEN_FILE_FREQUENCY_KHZ
:
271 /* ignore remainders < 100, so 22050 Hz becomes just 22k */
272 if ((id3
->frequency
% 1000) < 100)
273 snprintf(buf
, buf_size
, "%ld", id3
->frequency
/ 1000);
275 snprintf(buf
, buf_size
, "%ld.%d",
276 id3
->frequency
/ 1000,
277 (id3
->frequency
% 1000) / 100);
279 case WPS_TOKEN_FILE_NAME
:
280 if (get_dir(buf
, buf_size
, id3
->path
, 0)) {
281 /* Remove extension */
282 char* sep
= strrchr(buf
, '.');
289 case WPS_TOKEN_FILE_NAME_WITH_EXTENSION
:
290 return get_dir(buf
, buf_size
, id3
->path
, 0);
291 case WPS_TOKEN_FILE_SIZE
:
292 snprintf(buf
, buf_size
, "%ld", id3
->filesize
/ 1024);
294 case WPS_TOKEN_FILE_VBR
:
295 return (id3
->vbr
) ? "(avg)" : NULL
;
296 case WPS_TOKEN_FILE_DIRECTORY
:
297 return get_dir(buf
, buf_size
, id3
->path
, token
->value
.i
);
300 case WPS_TOKEN_DATABASE_PLAYCOUNT
:
302 *intval
= id3
->playcount
+ 1;
303 snprintf(buf
, buf_size
, "%ld", id3
->playcount
);
305 case WPS_TOKEN_DATABASE_RATING
:
307 *intval
= id3
->rating
+ 1;
308 snprintf(buf
, buf_size
, "%ld", id3
->rating
);
310 case WPS_TOKEN_DATABASE_AUTOSCORE
:
312 *intval
= id3
->score
+ 1;
313 snprintf(buf
, buf_size
, "%ld", id3
->score
);
321 else /* id3 == NULL, handle the error based on the expected return type */
325 /* Most tokens expect NULL on error so leave that for the default case,
326 * The ones that expect "0" need to be handled */
327 case WPS_TOKEN_FILE_FREQUENCY
:
328 case WPS_TOKEN_FILE_FREQUENCY_KHZ
:
329 case WPS_TOKEN_FILE_SIZE
:
331 case WPS_TOKEN_DATABASE_PLAYCOUNT
:
332 case WPS_TOKEN_DATABASE_RATING
:
333 case WPS_TOKEN_DATABASE_AUTOSCORE
:
345 /* Return the tags value as text. buf should be used as temp storage if needed.
347 intval is used with conditionals/enums: when this function is called,
348 intval should contain the number of options in the conditional/enum.
349 When this function returns, intval is -1 if the tag is non numeric or,
350 if the tag is numeric, *intval is the enum case we want to go to (between 1
351 and the original value of *intval, inclusive).
352 When not treating a conditional/enum, intval should be NULL.
354 const char *get_token_value(struct gui_wps
*gwps
,
355 struct wps_token
*token
,
356 char *buf
, int buf_size
,
362 struct wps_data
*data
= gwps
->data
;
363 struct wps_state
*state
= gwps
->state
;
364 struct mp3entry
*id3
; /* Think very carefully about using this.
365 maybe get_id3_token() is the better place? */
366 const char *out_text
= NULL
;
378 struct tm
* tm
= NULL
;
380 /* if the token is an RTC one, update the time
381 and do the necessary checks */
382 if (token
->type
>= WPS_TOKENS_RTC_BEGIN
383 && token
->type
<= WPS_TOKENS_RTC_END
)
399 out_text
= get_id3_token(token
, id3
, buf
, buf_size
, limit
, intval
);
405 case WPS_TOKEN_CHARACTER
:
406 if (token
->value
.c
== '\n')
408 return &(token
->value
.c
);
410 case WPS_TOKEN_STRING
:
411 return (char*)token
->value
.data
;
413 case WPS_TOKEN_TRANSLATEDSTRING
:
414 return (char*)P2STR(ID2P(token
->value
.i
));
416 case WPS_TOKEN_PLAYLIST_ENTRIES
:
417 snprintf(buf
, buf_size
, "%d", playlist_amount());
420 case WPS_TOKEN_PLAYLIST_NAME
:
421 return playlist_name(NULL
, buf
, buf_size
);
423 case WPS_TOKEN_PLAYLIST_POSITION
:
424 snprintf(buf
, buf_size
, "%d", playlist_get_display_index());
427 case WPS_TOKEN_PLAYLIST_SHUFFLE
:
428 if ( global_settings
.playlist_shuffle
)
434 case WPS_TOKEN_VOLUME
:
435 snprintf(buf
, buf_size
, "%d", global_settings
.volume
);
438 if (global_settings
.volume
== sound_min(SOUND_VOLUME
))
442 else if (global_settings
.volume
== 0)
446 else if (global_settings
.volume
> 0)
452 *intval
= (limit
- 3) * (global_settings
.volume
453 - sound_min(SOUND_VOLUME
) - 1)
454 / (-1 - sound_min(SOUND_VOLUME
)) + 2;
459 case WPS_TOKEN_ALBUMART_FOUND
:
460 if (data
->albumart
) {
461 if (playback_current_aa_hid(data
->playback_aa_slot
) >= 0)
466 case WPS_TOKEN_ALBUMART_DISPLAY
:
469 if (!data
->albumart
->draw
)
470 data
->albumart
->draw
= true;
474 case WPS_TOKEN_BATTERY_PERCENT
:
476 int l
= battery_level();
480 limit
= MAX(limit
, 2);
482 /* First enum is used for "unknown level". */
483 *intval
= (limit
- 1) * l
/ 100 + 2;
490 snprintf(buf
, buf_size
, "%d", l
);
497 case WPS_TOKEN_BATTERY_VOLTS
:
499 unsigned int v
= battery_voltage();
500 snprintf(buf
, buf_size
, "%d.%02d", v
/ 1000, (v
% 1000) / 10);
504 case WPS_TOKEN_BATTERY_TIME
:
506 int t
= battery_time();
508 snprintf(buf
, buf_size
, "%dh %dm", t
/ 60, t
% 60);
515 case WPS_TOKEN_BATTERY_CHARGER_CONNECTED
:
517 if(charger_input_state
==CHARGER
)
523 #if CONFIG_CHARGING >= CHARGING_MONITOR
524 case WPS_TOKEN_BATTERY_CHARGING
:
526 if (charge_state
== CHARGING
|| charge_state
== TOPOFF
) {
533 #ifdef HAVE_USB_POWER
534 case WPS_TOKEN_USB_POWERED
:
539 case WPS_TOKEN_BATTERY_SLEEPTIME
:
541 if (get_sleep_timer() == 0)
545 format_time(buf
, buf_size
, get_sleep_timer() * 1000);
550 case WPS_TOKEN_PLAYBACK_STATUS
:
552 int status
= current_playmode();
554 int mode
= 1; /* stop */
555 if (status
== STATUS_PLAY
)
557 if (state
->is_fading
||
558 (status
== STATUS_PAUSE
&& !status_get_ffmode()))
559 mode
= 3; /* pause */
562 if (status_get_ffmode() == STATUS_FASTFORWARD
)
564 if (status_get_ffmode() == STATUS_FASTBACKWARD
)
567 #ifdef HAVE_RECORDING
569 if (status
== STATUS_RECORD
)
571 else if (status
== STATUS_RECORD_PAUSE
)
576 if (status
== STATUS_RADIO
)
578 else if (status
== STATUS_RADIO_PAUSE
)
586 snprintf(buf
, buf_size
, "%d", mode
-1);
590 case WPS_TOKEN_REPEAT_MODE
:
592 *intval
= global_settings
.repeat_mode
+ 1;
593 snprintf(buf
, buf_size
, "%d", global_settings
.repeat_mode
);
596 case WPS_TOKEN_RTC_PRESENT
:
604 case WPS_TOKEN_RTC_12HOUR_CFG
:
606 *intval
= global_settings
.timeformat
+ 1;
607 snprintf(buf
, buf_size
, "%d", global_settings
.timeformat
);
610 case WPS_TOKEN_RTC_DAY_OF_MONTH
:
611 /* d: day of month (01..31) */
612 snprintf(buf
, buf_size
, "%02d", tm
->tm_mday
);
614 *intval
= tm
->tm_mday
- 1;
617 case WPS_TOKEN_RTC_DAY_OF_MONTH_BLANK_PADDED
:
618 /* e: day of month, blank padded ( 1..31) */
619 snprintf(buf
, buf_size
, "%2d", tm
->tm_mday
);
621 *intval
= tm
->tm_mday
- 1;
624 case WPS_TOKEN_RTC_HOUR_24_ZERO_PADDED
:
625 /* H: hour (00..23) */
626 snprintf(buf
, buf_size
, "%02d", tm
->tm_hour
);
628 *intval
= tm
->tm_hour
;
631 case WPS_TOKEN_RTC_HOUR_24
:
632 /* k: hour ( 0..23) */
633 snprintf(buf
, buf_size
, "%2d", tm
->tm_hour
);
635 *intval
= tm
->tm_hour
;
638 case WPS_TOKEN_RTC_HOUR_12_ZERO_PADDED
:
639 /* I: hour (01..12) */
640 snprintf(buf
, buf_size
, "%02d",
641 (tm
->tm_hour
% 12 == 0) ? 12 : tm
->tm_hour
% 12);
643 *intval
= (tm
->tm_hour
% 12 == 0) ? 12 : tm
->tm_hour
% 12;
646 case WPS_TOKEN_RTC_HOUR_12
:
647 /* l: hour ( 1..12) */
648 snprintf(buf
, buf_size
, "%2d",
649 (tm
->tm_hour
% 12 == 0) ? 12 : tm
->tm_hour
% 12);
651 *intval
= (tm
->tm_hour
% 12 == 0) ? 12 : tm
->tm_hour
% 12;
654 case WPS_TOKEN_RTC_MONTH
:
655 /* m: month (01..12) */
657 *intval
= tm
->tm_mon
+ 1;
658 snprintf(buf
, buf_size
, "%02d", tm
->tm_mon
+ 1);
661 case WPS_TOKEN_RTC_MINUTE
:
662 /* M: minute (00..59) */
663 snprintf(buf
, buf_size
, "%02d", tm
->tm_min
);
665 *intval
= tm
->tm_min
;
668 case WPS_TOKEN_RTC_SECOND
:
669 /* S: second (00..59) */
670 snprintf(buf
, buf_size
, "%02d", tm
->tm_sec
);
672 *intval
= tm
->tm_sec
;
675 case WPS_TOKEN_RTC_YEAR_2_DIGITS
:
676 /* y: last two digits of year (00..99) */
677 snprintf(buf
, buf_size
, "%02d", tm
->tm_year
% 100);
679 *intval
= tm
->tm_year
% 100;
682 case WPS_TOKEN_RTC_YEAR_4_DIGITS
:
683 /* Y: year (1970...) */
684 snprintf(buf
, buf_size
, "%04d", tm
->tm_year
+ 1900);
686 *intval
= tm
->tm_year
+ 1900;
689 case WPS_TOKEN_RTC_AM_PM_UPPER
:
690 /* p: upper case AM or PM indicator */
692 *intval
= tm
->tm_hour
/12 == 0 ? 0 : 1;
693 return tm
->tm_hour
/12 == 0 ? "AM" : "PM";
695 case WPS_TOKEN_RTC_AM_PM_LOWER
:
696 /* P: lower case am or pm indicator */
698 *intval
= tm
->tm_hour
/12 == 0 ? 0 : 1;
699 return tm
->tm_hour
/12 == 0 ? "am" : "pm";
701 case WPS_TOKEN_RTC_WEEKDAY_NAME
:
702 /* a: abbreviated weekday name (Sun..Sat) */
703 return str(LANG_WEEKDAY_SUNDAY
+ tm
->tm_wday
);
705 case WPS_TOKEN_RTC_MONTH_NAME
:
706 /* b: abbreviated month name (Jan..Dec) */
707 return str(LANG_MONTH_JANUARY
+ tm
->tm_mon
);
709 case WPS_TOKEN_RTC_DAY_OF_WEEK_START_MON
:
710 /* u: day of week (1..7); 1 is Monday */
712 *intval
= (tm
->tm_wday
== 0) ? 7 : tm
->tm_wday
;
713 snprintf(buf
, buf_size
, "%1d", tm
->tm_wday
+ 1);
716 case WPS_TOKEN_RTC_DAY_OF_WEEK_START_SUN
:
717 /* w: day of week (0..6); 0 is Sunday */
719 *intval
= tm
->tm_wday
+ 1;
720 snprintf(buf
, buf_size
, "%1d", tm
->tm_wday
);
723 case WPS_TOKEN_RTC_DAY_OF_MONTH
:
724 case WPS_TOKEN_RTC_DAY_OF_MONTH_BLANK_PADDED
:
725 case WPS_TOKEN_RTC_HOUR_24_ZERO_PADDED
:
726 case WPS_TOKEN_RTC_HOUR_24
:
727 case WPS_TOKEN_RTC_HOUR_12_ZERO_PADDED
:
728 case WPS_TOKEN_RTC_HOUR_12
:
729 case WPS_TOKEN_RTC_MONTH
:
730 case WPS_TOKEN_RTC_MINUTE
:
731 case WPS_TOKEN_RTC_SECOND
:
732 case WPS_TOKEN_RTC_AM_PM_UPPER
:
733 case WPS_TOKEN_RTC_AM_PM_LOWER
:
734 case WPS_TOKEN_RTC_YEAR_2_DIGITS
:
736 case WPS_TOKEN_RTC_YEAR_4_DIGITS
:
738 case WPS_TOKEN_RTC_WEEKDAY_NAME
:
739 case WPS_TOKEN_RTC_MONTH_NAME
:
741 case WPS_TOKEN_RTC_DAY_OF_WEEK_START_MON
:
742 case WPS_TOKEN_RTC_DAY_OF_WEEK_START_SUN
:
746 #ifdef HAVE_LCD_CHARCELLS
747 case WPS_TOKEN_PROGRESSBAR
:
749 char *end
= utf8encode(data
->wps_progress_pat
[0], buf
);
754 case WPS_TOKEN_PLAYER_PROGRESSBAR
:
757 /* we need 11 characters (full line) for
759 strlcpy(buf
, " ", buf_size
);
763 /* Tell the user if we have an OldPlayer */
764 strlcpy(buf
, " <Old LCD> ", buf_size
);
771 #if (CONFIG_CODEC == SWCODEC)
772 case WPS_TOKEN_CROSSFADE
:
773 #ifdef HAVE_CROSSFADE
775 *intval
= global_settings
.crossfade
+ 1;
776 snprintf(buf
, buf_size
, "%d", global_settings
.crossfade
);
778 snprintf(buf
, buf_size
, "%d", 0);
782 case WPS_TOKEN_REPLAYGAIN
:
786 if (global_settings
.replaygain_type
== REPLAYGAIN_OFF
)
792 type
= get_replaygain_mode(id3
->track_gain_string
!= NULL
,
793 id3
->album_gain_string
!= NULL
);
798 val
= 6; /* no tag */
802 if (global_settings
.replaygain_type
== REPLAYGAIN_SHUFFLE
)
815 /* due to above, coming here with !id3 shouldn't be possible */
818 strlcpy(buf
, id3
->track_gain_string
, buf_size
);
822 strlcpy(buf
, id3
->album_gain_string
, buf_size
);
827 #endif /* (CONFIG_CODEC == SWCODEC) */
829 #if (CONFIG_CODEC != MAS3507D)
830 case WPS_TOKEN_SOUND_PITCH
:
832 int32_t pitch
= sound_get_pitch();
833 snprintf(buf
, buf_size
, "%ld.%ld",
834 pitch
/ PITCH_SPEED_PRECISION
,
835 (pitch
% PITCH_SPEED_PRECISION
) / (PITCH_SPEED_PRECISION
/ 10));
838 *intval
= pitch_speed_enum(limit
, pitch
,
839 PITCH_SPEED_PRECISION
* 100);
844 #if CONFIG_CODEC == SWCODEC
845 case WPS_TOKEN_SOUND_SPEED
:
847 int32_t pitch
= sound_get_pitch();
849 if (dsp_timestretch_available())
850 speed
= GET_SPEED(pitch
, dsp_get_timestretch());
853 snprintf(buf
, buf_size
, "%ld.%ld",
854 speed
/ PITCH_SPEED_PRECISION
,
855 (speed
% PITCH_SPEED_PRECISION
) / (PITCH_SPEED_PRECISION
/ 10));
857 *intval
= pitch_speed_enum(limit
, speed
,
858 PITCH_SPEED_PRECISION
* 100);
863 case WPS_TOKEN_MAIN_HOLD
:
864 #ifdef HAS_BUTTON_HOLD
867 if (is_keys_locked())
868 #endif /*hold switch or softlock*/
873 #ifdef HAS_REMOTE_BUTTON_HOLD
874 case WPS_TOKEN_REMOTE_HOLD
:
875 if (remote_button_hold())
881 #if (CONFIG_LED == LED_VIRTUAL) || defined(HAVE_REMOTE_LCD)
882 case WPS_TOKEN_VLED_HDD
:
888 case WPS_TOKEN_BUTTON_VOLUME
:
889 if (global_status
.last_volume_change
&&
890 TIME_BEFORE(current_tick
, global_status
.last_volume_change
+
891 token
->value
.i
* TIMEOUT_UNIT
))
894 case WPS_TOKEN_LASTTOUCH
:
895 #ifdef HAVE_TOUCHSCREEN
896 if (TIME_BEFORE(current_tick
, token
->value
.i
* TIMEOUT_UNIT
+
897 touchscreen_last_touch()))
902 case WPS_TOKEN_SETTING
:
906 /* Handle contionals */
907 const struct settings_list
*s
= settings
+token
->value
.i
;
908 switch (s
->flags
&F_T_MASK
)
913 /* %?St|name|<#000000|#000001|...|#FFFFFF> */
914 /* shouldn't overflow since colors are stored
916 * but this is pretty useless anyway */
917 *intval
= *(int*)s
->setting
+ 1;
918 else if (s
->cfg_vals
== NULL
)
919 /* %?St|name|<1st choice|2nd choice|...> */
920 *intval
= (*(int*)s
->setting
-s
->int_setting
->min
)
921 /s
->int_setting
->step
+ 1;
923 /* %?St|name|<1st choice|2nd choice|...> */
924 /* Not sure about this one. cfg_name/vals are
925 * indexed from 0 right? */
926 *intval
= *(int*)s
->setting
+ 1;
929 /* %?St|name|<if true|if false> */
930 *intval
= *(bool*)s
->setting
?1:2;
933 /* %?St|name|<if non empty string|if empty>
934 * The string's emptyness discards the setting's
935 * prefix and suffix */
936 *intval
= ((char*)s
->setting
)[0]?1:2;
939 /* This shouldn't happen ... but you never know */
944 cfg_to_string(token
->value
.i
,buf
,buf_size
);
947 /* Recording tokens */
948 case WPS_TOKEN_HAVE_RECORDING
:
949 #ifdef HAVE_RECORDING
955 #ifdef HAVE_RECORDING
956 case WPS_TOKEN_REC_FREQ
: /* order from REC_FREQ_CFG_VAL_LIST */
958 #if CONFIG_CODEC == SWCODEC
959 unsigned long samprk
;
960 int rec_freq
= global_settings
.rec_frequency
;
965 #if defined(HAVE_SPDIF_REC)
966 if (global_settings
.rec_source
== AUDIO_SRC_SPDIF
)
968 /* Use rate in use, not current measured rate if it changed */
969 samprk
= pcm_rec_sample_rate();
971 while (rec_freq
< SAMPR_NUM_FREQ
&&
972 audio_master_sampr_list
[rec_freq
] != samprk
)
979 samprk
= rec_freq_sampr
[rec_freq
];
980 #endif /* SIMULATOR */
985 REC_HAVE_96_(case REC_FREQ_96
:
988 REC_HAVE_88_(case REC_FREQ_88
:
991 REC_HAVE_64_(case REC_FREQ_64
:
994 REC_HAVE_48_(case REC_FREQ_48
:
997 REC_HAVE_44_(case REC_FREQ_44
:
1000 REC_HAVE_32_(case REC_FREQ_32
:
1003 REC_HAVE_24_(case REC_FREQ_24
:
1006 REC_HAVE_22_(case REC_FREQ_22
:
1009 REC_HAVE_16_(case REC_FREQ_16
:
1012 REC_HAVE_12_(case REC_FREQ_12
:
1015 REC_HAVE_11_(case REC_FREQ_11
:
1018 REC_HAVE_8_(case REC_FREQ_8
:
1023 snprintf(buf
, buf_size
, "%d.%1d", samprk
/1000,samprk
%1000);
1026 static const char * const freq_strings
[] =
1027 {"--", "44", "48", "32", "22", "24", "16"};
1028 int freq
= 1 + global_settings
.rec_frequency
;
1029 #ifdef HAVE_SPDIF_REC
1030 if (global_settings
.rec_source
== AUDIO_SRC_SPDIF
)
1032 /* Can't measure S/PDIF sample rate on Archos/Sim yet */
1035 #endif /* HAVE_SPDIF_IN */
1037 *intval
= freq
+1; /* so the token gets a value 1<=x<=7 */
1038 snprintf(buf
, buf_size
, "%d\n",
1039 freq_strings
[global_settings
.rec_frequency
]);
1043 #if CONFIG_CODEC == SWCODEC
1044 case WPS_TOKEN_REC_ENCODER
:
1046 int rec_format
= global_settings
.rec_format
+1; /* WAV, AIFF, WV, MPEG */
1048 *intval
= rec_format
;
1051 case REC_FORMAT_PCM_WAV
:
1053 case REC_FORMAT_AIFF
:
1055 case REC_FORMAT_WAVPACK
:
1057 case REC_FORMAT_MPA_L3
:
1065 case WPS_TOKEN_REC_BITRATE
:
1066 #if CONFIG_CODEC == SWCODEC
1067 if (global_settings
.rec_format
== REC_FORMAT_MPA_L3
)
1071 #if 0 /* FIXME: I dont know if this is needed? */
1072 switch (1<<global_settings
.mp3_enc_config
.bitrate
)
1074 case MP3_BITR_CAP_8
:
1077 case MP3_BITR_CAP_16
:
1080 case MP3_BITR_CAP_24
:
1083 case MP3_BITR_CAP_32
:
1086 case MP3_BITR_CAP_40
:
1089 case MP3_BITR_CAP_48
:
1092 case MP3_BITR_CAP_56
:
1095 case MP3_BITR_CAP_64
:
1098 case MP3_BITR_CAP_80
:
1101 case MP3_BITR_CAP_96
:
1104 case MP3_BITR_CAP_112
:
1107 case MP3_BITR_CAP_128
:
1110 case MP3_BITR_CAP_144
:
1113 case MP3_BITR_CAP_160
:
1116 case MP3_BITR_CAP_192
:
1121 *intval
= global_settings
.mp3_enc_config
.bitrate
+1;
1123 snprintf(buf
, buf_size
, "%d", global_settings
.mp3_enc_config
.bitrate
+1);
1127 return NULL
; /* Fixme later */
1128 #else /* CONFIG_CODEC == HWCODEC */
1130 *intval
= global_settings
.rec_quality
+1;
1131 snprintf(buf
, buf_size
, "%d", global_settings
.rec_quality
);
1134 case WPS_TOKEN_REC_MONO
:
1135 if (!global_settings
.rec_channels
)
1139 #endif /* HAVE_RECORDING */
1140 case WPS_TOKEN_CURRENT_SCREEN
:
1142 int curr_screen
= current_screen();
1144 #ifdef HAVE_RECORDING
1145 /* override current_screen() for recording screen since it may
1146 * be entered from the radio screen */
1147 if (in_recording_screen())
1148 curr_screen
= GO_TO_RECSCREEN
;
1151 switch (curr_screen
)
1156 #ifdef HAVE_RECORDING
1157 case GO_TO_RECSCREEN
:
1166 default: /* lists */
1173 *intval
= curr_screen
;
1175 snprintf(buf
, buf_size
, "%d", curr_screen
);
1179 case WPS_TOKEN_LANG_IS_RTL
:
1180 return lang_is_rtl() ? "r" : NULL
;