diff options
Diffstat (limited to 'ext/mixed/js/display-audio.js')
| -rw-r--r-- | ext/mixed/js/display-audio.js | 47 | 
1 files changed, 45 insertions, 2 deletions
| diff --git a/ext/mixed/js/display-audio.js b/ext/mixed/js/display-audio.js index 0cd8a625..cc7e9e93 100644 --- a/ext/mixed/js/display-audio.js +++ b/ext/mixed/js/display-audio.js @@ -17,16 +17,19 @@  /* global   * AudioSystem + * CacheMap + * api   */  class DisplayAudio {      constructor(display) {          this._display = display;          this._audioPlaying = null; -        this._audioSystem = new AudioSystem(true); +        this._audioSystem = new AudioSystem();          this._autoPlayAudioTimer = null;          this._autoPlayAudioDelay = 400;          this._eventListeners = new EventListenerCollection(); +        this._cache = new CacheMap(32);      }      get autoPlayAudioDelay() { @@ -118,7 +121,7 @@ class DisplayAudio {              let info;              try {                  let source; -                ({audio, source} = await this._audioSystem.createExpressionAudio(sources, expression, reading, {textToSpeechVoice, customSourceUrl})); +                ({audio, source} = await this._createExpressionAudio(sources, expression, reading, {textToSpeechVoice, customSourceUrl}));                  const sourceIndex = sources.indexOf(source);                  info = `From source ${1 + sourceIndex}: ${source}`;              } catch (e) { @@ -182,4 +185,44 @@ class DisplayAudio {          }          return results;      } + +    async _createExpressionAudio(sources, expression, reading, details) { +        const key = JSON.stringify([expression, reading]); + +        const cacheValue = this._cache.get(key); +        if (typeof cacheValue !== 'undefined') { +            return cacheValue; +        } + +        for (let i = 0, ii = sources.length; i < ii; ++i) { +            const source = sources[i]; +            const infoList = await await api.getExpressionAudioInfoList(source, expression, reading, details); +            for (let j = 0, jj = infoList.length; j < jj; ++j) { +                const info = infoList[j]; +                let audio; +                try { +                    audio = await this._createAudioFromInfo(info, source); +                } catch (e) { +                    continue; +                } + +                const result = {audio, source, infoList, infoListIndex: j}; +                this._cache.set(key, result); +                return result; +            } +        } + +        throw new Error('Could not create audio'); +    } + +    async _createAudioFromInfo(info, source) { +        switch (info.type) { +            case 'url': +                return await this._audioSystem.createAudio(info.url, source); +            case 'tts': +                return this._audioSystem.createTextToSpeechAudio(info.text, info.voice); +            default: +                throw new Error(`Unsupported type: ${info.type}`); +        } +    }  } |