Skip to content

Commit 91d4c79

Browse files
Raoul StraczowskiRaoul Straczowski
authored andcommitted
refactor audio player
1 parent d9aa64f commit 91d4c79

4 files changed

Lines changed: 51 additions & 42 deletions

File tree

src/audio-player.ts

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
const createAudioPlayer = () => {
2+
const audioCache = new Map<string, HTMLAudioElement>()
3+
4+
const playExpression = (timeId: string, romaji: string) => {
5+
const soundId = `${timeId}_${romaji.replaceAll(" ", "_")}`
6+
const audioUrl = `${import.meta.env.BASE_URL}sound/voice/${soundId}.webm`
7+
const audio = getOrCreateAudio(audioUrl)
8+
audio.play()
9+
}
10+
11+
const playSuccessSound = () => {
12+
playActionSound('success.mp3')
13+
}
14+
15+
const playFailSound = () => {
16+
playActionSound('fail.mp3')
17+
}
18+
19+
const playActionSound = (filename: string) => {
20+
const audioUrl = `${import.meta.env.BASE_URL}sound/action/${filename}`
21+
const audio = getOrCreateAudio(audioUrl)
22+
audio.play()
23+
}
24+
25+
const getOrCreateAudio = (url: string): HTMLAudioElement => {
26+
if (audioCache.has(url)) {
27+
const cachedAudio = audioCache.get(url)
28+
if (cachedAudio) {
29+
cachedAudio.currentTime = 0
30+
return cachedAudio
31+
}
32+
}
33+
const audio = new Audio(url)
34+
audioCache.set(url, audio)
35+
return audio
36+
}
37+
38+
return {
39+
playSuccessSound,
40+
playFailSound,
41+
playExpression
42+
}
43+
}
44+
45+
export const audioPlayer = createAudioPlayer()

src/components/ResultDisplay.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import speakerIcon from '../assets/speaker.svg'
2-
import { playExpression } from '../utils/play-sound'
2+
import { audioPlayer } from '../audio-player'
33
import type { Expression } from '../types/basic'
44

55
interface ResultDisplayProps {
@@ -15,7 +15,7 @@ export const ResultDisplay = ({ result, timeId, encouragementMessage }: ResultDi
1515

1616
const handlePlayAudio = () => {
1717
if (timeId && result) {
18-
playExpression(timeId, result.romaji)
18+
audioPlayer.playExpression(timeId, result.romaji)
1919
}
2020
}
2121

src/store.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { create } from 'zustand'
22
import { getValidExpressions, removeWhitespace } from './utils/get-valid-expressions'
3-
import { playSuccessSound, playFailSound, playExpression } from './utils/play-sound'
3+
import { audioPlayer } from './audio-player'
44
import { getEncouragementMessage } from './utils/get-encouragement-message'
55
import { type Expression, Difficulty, ClockDisplayMode } from './types/basic'
66
import { type AppStore } from './types/app-store'
@@ -60,14 +60,14 @@ const findMatchingExpression = (userInput: string, validExpressions: Array<Expre
6060
const handleFailure = (set: (partial: AppStore | Partial<AppStore> | ((state: AppStore) => AppStore | Partial<AppStore>)) => void, validExpressions: Array<Expression>) => {
6161
const encouragementMessage = getEncouragementMessage()
6262
set({ allValidExpressions: validExpressions, result: null, encouragementMessage })
63-
playFailSound()
63+
audioPlayer.playFailSound()
6464
}
6565

6666
const handleSuccess = (set: (partial: AppStore | Partial<AppStore> | ((state: AppStore) => AppStore | Partial<AppStore>)) => void, timeId: string, validExpressions: Array<Expression>, result: Expression) => {
6767
set({ allValidExpressions: validExpressions, result, encouragementMessage: null })
68-
playSuccessSound()
68+
audioPlayer.playSuccessSound()
6969
setTimeout(() => {
70-
playExpression(timeId, result.romaji)
70+
audioPlayer.playExpression(timeId, result.romaji)
7171
}, 700)
7272
}
7373

src/utils/play-sound.ts

Lines changed: 0 additions & 36 deletions
This file was deleted.

0 commit comments

Comments
 (0)