diff --git a/src/ersky9x/audio.cpp b/src/ersky9x/audio.cpp index f75a03415..c55c32399 100644 --- a/src/ersky9x/audio.cpp +++ b/src/ersky9x/audio.cpp @@ -411,6 +411,16 @@ void AudioQueue::pause(uint8_t tLen) play(0, 0, tLen); // a pause } +bool AudioQueue::isPlaying(uint8_t id) +{ + for (uint8_t i=0; ifunc == FUNC_PLAY_TRACK) { - char lfn[] = SOUNDS_PATH "/xxxxxx.wav"; - strncpy(lfn+sizeof(SOUNDS_PATH), sd->param, sizeof(sd->param)); - lfn[sizeof(SOUNDS_PATH)+sizeof(sd->param)] = '\0'; - strcat(lfn+sizeof(SOUNDS_PATH), SOUNDS_EXT); - audioQueue.playFile(lfn); + if (!IS_PLAYING(i+1)) { + char lfn[] = SOUNDS_PATH "/xxxxxx.wav"; + strncpy(lfn+sizeof(SOUNDS_PATH), sd->param, sizeof(sd->param)); + lfn[sizeof(SOUNDS_PATH)+sizeof(sd->param)] = '\0'; + strcat(lfn+sizeof(SOUNDS_PATH), SOUNDS_EXT); + PLAY_FILE(lfn, i+1); + } } else if (sd->func == FUNC_PLAY_VALUE) { - playValue(FSW_PARAM(sd)); + if (!IS_PLAYING(i+1)) { + PLAY_VALUE(FSW_PARAM(sd), i+1); + } } else if (sd->func == FUNC_VOLUME) { requiredSpeakerVolume = ((1024 + getValue(FSW_PARAM(sd))) * NUM_VOL_LEVELS) / 2048; } #elif defined(VOICE) else if (sd->func == FUNC_PLAY_TRACK) { - pushCustomPrompt(sd->param); + if (!IS_PLAYING(i+1)) { + PUSH_CUSTOM_PROMPT(sd->param, i+1); + } } else if (sd->func == FUNC_PLAY_VALUE) { - playValue(sd->param); + if (!IS_PLAYING(i+1)) { + PLAY_VALUE(FSW_PARAM(sd), i+1); + } } #endif diff --git a/src/open9x.h b/src/open9x.h index 38ff7ca83..b50765d2e 100644 --- a/src/open9x.h +++ b/src/open9x.h @@ -832,8 +832,6 @@ extern volatile uint8_t g_blinkTmr10ms; extern uint8_t g_beepCnt; extern uint8_t g_beepVal[5]; -#include "translations.h" - extern uint8_t ppmInState; //0=unsync 1..8= wait for value i-1 extern int16_t g_ppmIns[8]; extern int32_t chans[NUM_CHNOUT]; @@ -1027,6 +1025,8 @@ enum AUDIO_SOUNDS { #include "gruvin9x/somo14d.h" #endif +#include "translations.h" + #if defined(HAPTIC) #include "haptic.h" #endif diff --git a/src/stock/voice.h b/src/stock/voice.h index 13aa317ab..4a4eef6e1 100644 --- a/src/stock/voice.h +++ b/src/stock/voice.h @@ -121,3 +121,11 @@ inline bool isPlaying() } \ } +#define PLAY_FUNCTION(x, ...) void x(__VA_ARGS__) +#define PUSH_PROMPT(p) pushPrompt((p)) +#define PUSH_CUSTOM_PROMPT(p, ...) pushCustomPrompt((p)) +#define PLAY_NUMBER(n, u, a) playNumber((n), (u), (a)) +#define PLAY_DURATION(d) playDuration((d)) +#define IS_PLAYING(id) isPlaying() +#define PLAY_VALUE(v, id) playValue((v)) +#define PLAY_FILE(f, id) audioQueue.playFile((f)) diff --git a/src/translations.h b/src/translations.h index 7af946694..fee92b1fd 100644 --- a/src/translations.h +++ b/src/translations.h @@ -438,8 +438,8 @@ extern const pm_char STR_NA[]; #if defined(VOICE) -void playNumber(int16_t number, uint8_t unit=0, uint8_t att=0); -void playDuration(int16_t seconds); +PLAY_FUNCTION(playNumber, int16_t number, uint8_t unit, uint8_t att); +PLAY_FUNCTION(playDuration, int16_t seconds); #endif #endif diff --git a/src/translations/tts_cz.cpp b/src/translations/tts_cz.cpp index d83b29985..b816414e7 100644 --- a/src/translations/tts_cz.cpp +++ b/src/translations/tts_cz.cpp @@ -104,26 +104,27 @@ enum CzechPrompts { #if defined(VOICE) +#if defined(PCBSTD) +#define PUSH_UNIT_PROMPT(p, u) pushUnitPrompt((p), (u)) +#else +#define PUSH_UNIT_PROMPT(p, u) pushUnitPrompt((p), (u), id) +#endif + #define MUZSKY 0x80 #define ZENSKY 0x81 #define STREDNI 0x82 -void pushUnitPrompt(int16_t number, uint8_t unitprompt) +PLAY_FUNCTION(pushUnitPrompt, int16_t number, uint8_t unitprompt) { - if (number == 1) { - pushPrompt(unitprompt); - } - else { - if (number > 1 && number < 5) { - pushPrompt(unitprompt+1); - } - else { - pushPrompt(unitprompt+2); - } - } + if (number == 1) + PUSH_PROMPT(unitprompt); + else if (number > 1 && number < 5) + PUSH_PROMPT(unitprompt+1); + else + PUSH_PROMPT(unitprompt+2); } -void playNumber(int16_t number, uint8_t unit, uint8_t att) +PLAY_FUNCTION(playNumber, int16_t number, uint8_t unit, uint8_t att) { /* if digit >= 1000000000: temp_digit, digit = divmod(digit, 1000000000) @@ -135,29 +136,22 @@ void playNumber(int16_t number, uint8_t unit, uint8_t att) prompts.append(Prompt(GUIDE_00_MILLION, dir=2)) */ - if (number < 0) { - pushPrompt(PROMPT_MINUS); - number = -number; - } - int8_t mode = MODE(att); if (mode > 0) { div_t qr = div(number, (mode == 1 ? 10 : 100)); if (qr.rem) { - playNumber(qr.quot); - if (qr.quot == 0) { - pushPrompt(PROMPT_CELA); - } - else { - pushUnitPrompt(qr.quot,PROMPT_CELA); - } + PLAY_NUMBER(qr.quot, 0, 0); + if (qr.quot == 0) + PUSH_PROMPT(PROMPT_CELA); + else + PUSH_UNIT_PROMPT(qr.quot, PROMPT_CELA); if (mode == 2 && qr.rem < 10) - pushPrompt (PROMPT_NULA); - playNumber(qr.rem,0,ZENSKY); - pushPrompt(PROMPT_UNITS_BASE+((unit-1)*4)+3); + PUSH_PROMPT(PROMPT_NULA); + PLAY_NUMBER(qr.rem, 0, ZENSKY); + PUSH_PROMPT(PROMPT_UNITS_BASE+((unit-1)*4)+3); } else - playNumber(qr.quot, unit); + PLAY_NUMBER(qr.quot, unit, 0); return; } @@ -168,83 +162,86 @@ void playNumber(int16_t number, uint8_t unit, uint8_t att) break; case 4: att = ZENSKY; + break; case 8: att = STREDNI; + break; case 10: case 11: case 12: att = ZENSKY; + break; default: att = MUZSKY; + break; } - - + if ((number == 1) && (att == MUZSKY)) { - pushPrompt(PROMPT_JEDEN); + PUSH_PROMPT(PROMPT_JEDEN); number = -1; } if ((number == 1) && (att == STREDNI)) { - pushPrompt(PROMPT_JEDNO); + PUSH_PROMPT(PROMPT_JEDNO); number = -1; } if ((number == 2) && ((att == ZENSKY) || (att == STREDNI))) { - pushPrompt(PROMPT_DVE); + PUSH_PROMPT(PROMPT_DVE); number = -1; } if (number >= 1000) { if (number >= 2000) - playNumber(number / 1000); + PLAY_NUMBER(number / 1000, 0, 0); if (number >= 2000 && number < 5000) - pushPrompt(PROMPT_TISICE); + PUSH_PROMPT(PROMPT_TISICE); else - pushPrompt(PROMPT_TISIC); + PUSH_PROMPT(PROMPT_TISIC); number %= 1000; if (number == 0) number = -1; } if (number >= 100) { - pushPrompt(PROMPT_STO + (number/100)-1); + PUSH_PROMPT(PROMPT_STO + (number/100)-1); number %= 100; if (number == 0) number = -1; } if (number >= 0) { - pushPrompt(PROMPT_NULA+number); + PUSH_PROMPT(PROMPT_NULA+number); } if (unit) { - pushUnitPrompt(tmp,(PROMPT_UNITS_BASE+((unit-1)*4))); + PUSH_UNIT_PROMPT(tmp, (PROMPT_UNITS_BASE+((unit-1)*4))); } } -void playDuration(int16_t seconds) +PLAY_FUNCTION(playDuration, int16_t seconds) { if (seconds < 0) { - pushPrompt(PROMPT_MINUS); + PUSH_PROMPT(PROMPT_MINUS); seconds = -seconds; } uint8_t tmp = seconds / 3600; seconds %= 3600; if (tmp > 0) { - playNumber(tmp,0,ZENSKY); - pushUnitPrompt(tmp,PROMPT_HODINA); + PLAY_NUMBER(tmp, 0, ZENSKY); + PUSH_UNIT_PROMPT(tmp, PROMPT_HODINA); } tmp = seconds / 60; seconds %= 60; if (tmp > 0) { - playNumber(tmp,0,ZENSKY); - pushUnitPrompt(tmp,PROMPT_MINUTA); + PLAY_NUMBER(tmp, 0, ZENSKY); + PUSH_UNIT_PROMPT(tmp, PROMPT_MINUTA); } if (seconds > 0) { - playNumber(seconds,0,ZENSKY); - pushUnitPrompt(seconds,PROMPT_SEKUNDA); + PLAY_NUMBER(seconds, 0, ZENSKY); + PUSH_UNIT_PROMPT(seconds, PROMPT_SEKUNDA); } } diff --git a/src/translations/tts_en.cpp b/src/translations/tts_en.cpp index df78c021b..7c644d62b 100644 --- a/src/translations/tts_en.cpp +++ b/src/translations/tts_en.cpp @@ -72,7 +72,7 @@ enum EnglishPrompts { #if defined(VOICE) -void playNumber(int16_t number, uint8_t unit, uint8_t att) +PLAY_FUNCTION(playNumber, int16_t number, uint8_t unit, uint8_t att) { /* if digit >= 1000000000: temp_digit, digit = divmod(digit, 1000000000) @@ -85,65 +85,65 @@ void playNumber(int16_t number, uint8_t unit, uint8_t att) */ if (number < 0) { - pushPrompt(PROMPT_MINUS); + PUSH_PROMPT(PROMPT_MINUS); number = -number; } if (number >= 1000) { - playNumber(number / 1000); - pushPrompt(PROMPT_THOUSAND); + PLAY_NUMBER(number / 1000, 0, 0); + PUSH_PROMPT(PROMPT_THOUSAND); number %= 1000; if (number == 0) number = -1; } if (number >= 100) { - pushPrompt(PROMPT_ZERO + number/100); - pushPrompt(PROMPT_HUNDRED); + PUSH_PROMPT(PROMPT_ZERO + number/100); + PUSH_PROMPT(PROMPT_HUNDRED); number %= 100; if (number == 0) number = -1; } if (number >= 20) { - pushPrompt(PROMPT_TWENTY + (number-20)/10); + PUSH_PROMPT(PROMPT_TWENTY + (number-20)/10); number %= 10; if (number == 0) number = -1; } if (number >= 0) { - pushPrompt(PROMPT_ZERO+number); + PUSH_PROMPT(PROMPT_ZERO+number); } if (unit) { - pushPrompt(PROMPT_UNITS_BASE+unit-1); + PUSH_PROMPT(PROMPT_UNITS_BASE+unit-1); } } -void playDuration(int16_t seconds) +PLAY_FUNCTION(playDuration, int16_t seconds) { if (seconds < 0) { - pushPrompt(PROMPT_MINUS); + PUSH_PROMPT(PROMPT_MINUS); seconds = -seconds; } uint8_t tmp = seconds / 3600; seconds %= 3600; if (tmp > 0) { - playNumber(tmp); - pushPrompt(tmp == 1 ? PROMPT_HOUR : PROMPT_HOURS); + PLAY_NUMBER(tmp, 0, 0); + PUSH_PROMPT(tmp == 1 ? PROMPT_HOUR : PROMPT_HOURS); } tmp = seconds / 60; seconds %= 60; if (tmp > 0) { - playNumber(tmp); - pushPrompt(tmp == 1 ? PROMPT_MINUTE : PROMPT_MINUTES); + PLAY_NUMBER(tmp, 0, 0); + PUSH_PROMPT(tmp == 1 ? PROMPT_MINUTE : PROMPT_MINUTES); if (seconds > 0) - pushPrompt(PROMPT_AND); + PUSH_PROMPT(PROMPT_AND); } if (seconds > 0) { - playNumber(seconds); - pushPrompt(tmp == 1 ? PROMPT_SECOND : PROMPT_SECONDS); + PLAY_NUMBER(seconds, 0, 0); + PUSH_PROMPT(tmp == 1 ? PROMPT_SECOND : PROMPT_SECONDS); } } diff --git a/src/translations/tts_fr.cpp b/src/translations/tts_fr.cpp index 5045bf13c..32b356358 100644 --- a/src/translations/tts_fr.cpp +++ b/src/translations/tts_fr.cpp @@ -104,7 +104,7 @@ enum FrenchPrompts { #define FEMININ 0x80 -void playNumber(int16_t number, uint8_t unit, uint8_t att) +PLAY_FUNCTION(playNumber, int16_t number, uint8_t unit, uint8_t att) { /* if digit >= 1000000000: temp_digit, digit = divmod(digit, 1000000000) @@ -120,77 +120,77 @@ void playNumber(int16_t number, uint8_t unit, uint8_t att) if (mode > 0) { div_t qr = div(number, (mode == 1 ? 10 : 100)); if (qr.rem > 0) { - playNumber(qr.quot); - pushPrompt(PROMPT_VIRGULE); + PLAY_NUMBER(qr.quot, 0, 0); + PUSH_PROMPT(PROMPT_VIRGULE); if (mode==2 && qr.rem < 10) - pushPrompt(PROMPT_ZERO); - playNumber(qr.rem, unit); + PUSH_PROMPT(PROMPT_ZERO); + PLAY_NUMBER(qr.rem, unit, 0); } else { - playNumber(qr.quot, unit); + PLAY_NUMBER(qr.quot, unit, 0); } return; } if (number < 0) { - pushPrompt(PROMPT_MOINS); + PUSH_PROMPT(PROMPT_MOINS); number = -number; } if (number >= 1000) { if (number >= 2000) - playNumber(number / 1000); - pushPrompt(PROMPT_MILLE); + PLAY_NUMBER(number / 1000, 0, 0); + PUSH_PROMPT(PROMPT_MILLE); number %= 1000; if (number == 0) number = -1; } if (number >= 100) { if (number >= 200) - pushPrompt(PROMPT_ZERO + number/100); - pushPrompt(PROMPT_CENT); + PUSH_PROMPT(PROMPT_ZERO + number/100); + PUSH_PROMPT(PROMPT_CENT); number %= 100; if (number == 0) number = -1; } if (((number % 10) == 1) && number < 90 && (att & FEMININ)) { - pushPrompt(PROMPT_UNE+(number/10)); + PUSH_PROMPT(PROMPT_UNE+(number/10)); } else if (number >= 0) { - pushPrompt(PROMPT_ZERO+number); + PUSH_PROMPT(PROMPT_ZERO+number); } if (unit) { - pushPrompt(PROMPT_UNITS_BASE+unit-1); + PUSH_PROMPT(PROMPT_UNITS_BASE+unit-1); } } -void playDuration(int16_t seconds) +PLAY_FUNCTION(playDuration, int16_t seconds) { if (seconds < 0) { - pushPrompt(PROMPT_MOINS); + PUSH_PROMPT(PROMPT_MOINS); seconds = -seconds; } uint8_t tmp = seconds / 3600; seconds %= 3600; if (tmp > 0) { - playNumber(tmp, 0, FEMININ); - pushPrompt(PROMPT_HEURE); + PLAY_NUMBER(tmp, 0, FEMININ); + PUSH_PROMPT(PROMPT_HEURE); } tmp = seconds / 60; seconds %= 60; if (tmp > 0) { - playNumber(tmp, 0, FEMININ); - pushPrompt(PROMPT_MINUTE); + PLAY_NUMBER(tmp, 0, FEMININ); + PUSH_PROMPT(PROMPT_MINUTE); if (seconds > 0) - pushPrompt(PROMPT_ET); + PUSH_PROMPT(PROMPT_ET); } if (seconds > 0) { - playNumber(seconds, 0, FEMININ); - pushPrompt(PROMPT_SECONDE); + PLAY_NUMBER(seconds, 0, FEMININ); + PUSH_PROMPT(PROMPT_SECONDE); } } diff --git a/src/translations/tts_it.cpp b/src/translations/tts_it.cpp index 8b657855f..52b347caf 100644 --- a/src/translations/tts_it.cpp +++ b/src/translations/tts_it.cpp @@ -95,7 +95,7 @@ enum ItalianPrompts { #if defined(VOICE) -void playNumber(int16_t number, uint8_t unit, uint8_t att) +PLAY_FUNCTION(playNumber, int16_t number, uint8_t unit, uint8_t att) { /* if digit >= 1000000000: temp_digit, digit = divmod(digit, 1000000000) @@ -108,16 +108,16 @@ void playNumber(int16_t number, uint8_t unit, uint8_t att) */ if (number < 0) { - pushPrompt(PROMPT_MENO); + PUSH_PROMPT(PROMPT_MENO); number = -number; } if (number >= 1000) { if (number >= 2000) { - playNumber(number / 1000); - pushPrompt(PROMPT_MILA); + PLAY_NUMBER(number / 1000, 0, 0); + PUSH_PROMPT(PROMPT_MILA); } else { - pushPrompt(PROMPT_MILLE); + PUSH_PROMPT(PROMPT_MILLE); } number %= 1000; if (number == 0) @@ -125,23 +125,23 @@ void playNumber(int16_t number, uint8_t unit, uint8_t att) } if (number >= 100) { if (number >= 200) - pushPrompt(PROMPT_ZERO + number/100); - pushPrompt(PROMPT_CENT); + PUSH_PROMPT(PROMPT_ZERO + number/100); + PUSH_PROMPT(PROMPT_CENT); number %= 100; if (number == 0) number = -1; } - pushPrompt(PROMPT_ZERO+number); + PUSH_PROMPT(PROMPT_ZERO+number); if (unit) { - pushPrompt(PROMPT_UNITS_BASE+unit-1); + PUSH_PROMPT(PROMPT_UNITS_BASE+unit-1); } } -void playDuration(int16_t seconds) +PLAY_FUNCTION(playDuration, int16_t seconds) { if (seconds < 0) { - pushPrompt(PROMPT_MENO); + PUSH_PROMPT(PROMPT_MENO); seconds = -seconds; } @@ -151,11 +151,11 @@ void playDuration(int16_t seconds) if (tmp > 0) { ore=tmp; if (tmp > 1) { - playNumber(tmp, 0); - pushPrompt(PROMPT_ORE); + PLAY_NUMBER(tmp, 0, 0); + PUSH_PROMPT(PROMPT_ORE); } else { - pushPrompt(PROMPT_UN); - pushPrompt(PROMPT_ORA); + PUSH_PROMPT(PROMPT_UN); + PUSH_PROMPT(PROMPT_ORA); } } @@ -163,21 +163,21 @@ void playDuration(int16_t seconds) seconds %= 60; if (tmp > 0 || ore >0) { if (tmp != 1) { - playNumber(tmp, 0); - pushPrompt(PROMPT_MINUTI); + PLAY_NUMBER(tmp, 0, 0); + PUSH_PROMPT(PROMPT_MINUTI); } else { - pushPrompt(PROMPT_UN); - pushPrompt(PROMPT_MINUTO); + PUSH_PROMPT(PROMPT_UN); + PUSH_PROMPT(PROMPT_MINUTO); } - pushPrompt(PROMPT_E); + PUSH_PROMPT(PROMPT_E); } if (seconds != 1) { - playNumber(seconds, 0); - pushPrompt(PROMPT_SECONDI); + PLAY_NUMBER(seconds, 0, 0); + PUSH_PROMPT(PROMPT_SECONDI); } else { - pushPrompt(PROMPT_UN); - pushPrompt(PROMPT_SECONDO); + PUSH_PROMPT(PROMPT_UN); + PUSH_PROMPT(PROMPT_SECONDO); } }