1818#include "common.h"
1919#include "model.h"
2020#include "../music.h"
21+ #include "extended_audio.h"
2122#include "tx.h"
23+ #include "voice.h"
2224
2325#define MATCH_SECTION (s ) (strcasecmp(section, s) == 0)
2426#define MATCH_KEY (s ) (strcasecmp(name, s) == 0)
2830const char SECTION_VOICE_GLOBAL [] = "global" ;
2931const char SECTION_VOICE_CUSTOM [] = "custom" ;
3032
31- static const char * getfield (char * value , int num ) {
32- const char * tok ;
33- for (tok = strtok (value , "," ); tok && * tok ; tok = strtok (NULL , ",\n" )) {
34- if (!-- num )
35- return tok ;
36- }
37- return "" ;
38- }
39-
4033static int ini_handler (void * user , const char * section , const char * name , const char * value )
4134{
42- (void ) user ;
43- char tmp [100 ];
44- strlcpy (tmp , value , 100 );
45- int duration = atoi (getfield (tmp ,2 ));
46- #if HAS_MUSIC_CONFIG
47- char label [MAX_VOICE_LABEL ];
48- strlcpy (label ,getfield (tmp , 1 ), MAX_VOICE_LABEL );
49- #endif
35+ // ini_handler returns a requested mp3 label passed at *user to tempstring
36+ u16 req_id = * ((long * )user );
37+ u16 id = atoi (name );
38+ const char * ptr = value ;
39+ u8 k = 0 ;
40+ u16 duration = 0 ;
41+
42+ while (* ptr && * ptr != ',' ) {
43+ ptr ++ ;
44+ k ++ ;
45+ }
46+ if (* ptr == ',' ) {
47+ duration = atoi (ptr + 1 );
48+ }
5049
51- if (MATCH_SECTION (SECTION_VOICE_GLOBAL )) {
52- for (int i = 0 ; i < CUSTOM_ALARM_ID ; i ++ ) {
53- snprintf (tempstring , 4 , "%d" , i );
54- if (MATCH_KEY (tempstring )) {
55- voice_map [i ].duration = duration ;
56- voice_map [i ].id = i ;
5750#if HAS_MUSIC_CONFIG
58- strcpy (voice_map [i ].label , label );
51+ if ( k && (req_id != MAX_VOICEMAP_ENTRIES ) && (req_id == id ) ) {
52+ strlcpy (tempstring , value , k + 1 );
53+ tempstring [MAX_VOICE_LABEL ] = '\0' ; // limit label length
54+ return 1 ;
55+ }
5956#endif
60- return 1 ;
57+ if ( req_id == MAX_VOICEMAP_ENTRIES ) {
58+ if (MATCH_SECTION (SECTION_VOICE_GLOBAL )) {
59+ for (int i = 0 ; i < CUSTOM_ALARM_ID ; i ++ ) {
60+ snprintf (tempstring , 4 , "%d" , i );
61+ if (MATCH_KEY (tempstring )) {
62+ voice_map [i ].duration = duration ;
63+ voice_map [i ].id = i ;
64+ return 1 ;
65+ }
6166 }
6267 }
68+ if (MATCH_SECTION (SECTION_VOICE_CUSTOM )) {
69+ voice_map [voice_map_entries ].duration = duration ;
70+ voice_map [voice_map_entries ].id = id ;
71+ voice_map_entries ++ ;
72+ return 1 ;
73+ }
74+ printf ("Unknown entry in voice.ini: %s\n" , value );
75+ return 0 ;
6376 }
64- if (MATCH_SECTION (SECTION_VOICE_CUSTOM )) {
65- voice_map [voice_map_entries ].duration = duration ;
66- voice_map [voice_map_entries ].id = atoi (name );
67- #if HAS_MUSIC_CONFIG
68- strcpy (voice_map [voice_map_entries ].label , label );
69- #endif
70- voice_map_entries ++ ;
71- return 1 ;
72- }
73- printf ("Unknown entry in voice.ini: %s\n" , value );
74- return 0 ;
77+ return 1 ; // voice label ignored
7578}
7679
77- void CONFIG_VoiceParse ()
80+ const char * CONFIG_VoiceParse (unsigned id )
7881{
79- voice_map_entries = CUSTOM_ALARM_ID ;
8082 #ifdef _DEVO12_TARGET_H_
8183 static char filename [] = "media/voice.ini\0\0\0" ; // placeholder for longer folder name
8284 static u8 checked ;
@@ -92,9 +94,19 @@ void CONFIG_VoiceParse()
9294 #else
9395 char filename [] = "media/voice.ini" ;
9496 #endif
95- if (CONFIG_IniParse (filename , ini_handler , NULL )) {
96- printf ("Failed to parse voice.ini\n" );
97- Transmitter .audio_player = AUDIO_NONE ; // disable external voice output
97+ if (id == MAX_VOICEMAP_ENTRIES ) { // initial parse of voice.ini
98+ voice_map_entries = CUSTOM_ALARM_ID ; // Reserve space in map for global alerts
99+ if (CONFIG_IniParse (filename , ini_handler , & id )) {
100+ printf ("Failed to parse voice.ini\n" );
101+ Transmitter .audio_player = AUDIO_NONE ; // disable external voice output
102+ tempstring [0 ] = '\0' ;
103+ }
104+ }
105+ if ( (id < MAX_VOICEMAP_ENTRIES ) && (id >= CUSTOM_ALARM_ID ) ) {
106+ if (CONFIG_IniParse (filename , ini_handler , & id )) {
107+ // ini handler will return tempstring with label of id
108+ }
98109 }
110+ return tempstring ;
99111}
100112#endif
0 commit comments