11import {
2- Audio ,
32 BoxRenderable ,
43 MouseButton ,
54 MouseEvent ,
65 RGBA ,
76 TextAttributes ,
8- type AudioSound ,
97 type AudioVoice ,
108} from "@opentui/core"
119import { useRenderer } from "@opentui/solid"
1210import { For , createMemo , createSignal , onCleanup , onMount , type JSX } from "solid-js"
1311import { useTheme , tint } from "@tui/context/theme"
12+ import * as TuiAudio from "@tui/util/audio"
1413import { go , logo } from "@/cli/logo"
1514import pulseA from "../asset/pulse-a.wav" with { type : "file" }
1615import pulseB from "../asset/pulse-b.wav" with { type : "file" }
@@ -102,41 +101,18 @@ const GLOW_OUT = 1600
102101const PEAK = RGBA . fromInts ( 255 , 255 , 255 )
103102const PULSE_SOUNDS = [ pulseA , pulseB , pulseC ]
104103
105- let logoAudio : Audio | undefined
106- let logoAudioSounds : Promise < { charge : AudioSound | null ; pulse : ( AudioSound | null ) [ ] } > | undefined
107104let logoAudioVoice : AudioVoice | undefined
108105let logoAudioTail : ReturnType < typeof setTimeout > | undefined
109106let logoAudioSeq = 0
110107let logoAudioShot = 0
111108
112- function createLogoAudio ( ) {
113- if ( logoAudio ) return logoAudio
114- try {
115- logoAudio = Audio . create ( { autoStart : false } )
116- logoAudio . on ( "error" , ( ) => undefined )
117- return logoAudio
118- } catch {
119- return
120- }
121- }
122-
123- function loadLogoSounds ( audio : Audio ) {
124- logoAudioSounds ??= Promise . all ( [
125- audio . loadSoundFile ( charge ) . catch ( ( ) => null ) ,
126- Promise . all ( PULSE_SOUNDS . map ( ( file ) => audio . loadSoundFile ( file ) . catch ( ( ) => null ) ) ) ,
127- ] ) . then ( ( [ charge , pulse ] ) => ( { charge, pulse } ) )
128- return logoAudioSounds
129- }
130-
131109function startLogoSound ( ) {
132110 stopLogoSound ( )
133111 const id = ++ logoAudioSeq
134- const audio = createLogoAudio ( )
135- if ( ! audio || ( ! audio . isStarted ( ) && ! audio . start ( ) ) ) return
136- void loadLogoSounds ( audio )
137- . then ( ( sounds ) => {
138- if ( id !== logoAudioSeq || sounds . charge == null ) return
139- const voice = audio . play ( sounds . charge , { volume : 0.24 , loop : true } )
112+ void TuiAudio . loadSoundFile ( charge )
113+ . then ( ( sound ) => {
114+ if ( id !== logoAudioSeq || sound == null ) return
115+ const voice = TuiAudio . play ( sound , { volume : 0.24 , loop : true } )
140116 if ( voice == null ) return
141117 logoAudioVoice = voice
142118 } )
@@ -156,37 +132,32 @@ function stopLogoSound(delay = 0) {
156132 const voice = logoAudioVoice
157133 if ( delay <= 0 ) {
158134 logoAudioVoice = undefined
159- logoAudio ? .stopVoice ( voice )
135+ TuiAudio . stopVoice ( voice )
160136 return
161137 }
162138 logoAudioTail = setTimeout ( ( ) => {
163139 logoAudioTail = undefined
164140 if ( logoAudioVoice !== voice ) return
165141 logoAudioVoice = undefined
166- logoAudio ? .stopVoice ( voice )
142+ TuiAudio . stopVoice ( voice )
167143 } , delay )
168144}
169145
170146function pulseLogoSound ( scale = 1 ) {
171147 stopLogoSound ( 140 )
172148 const id = logoAudioSeq
173- const audio = createLogoAudio ( )
174- if ( ! audio || ( ! audio . isStarted ( ) && ! audio . start ( ) ) ) return
175- void loadLogoSounds ( audio )
176- . then ( ( sounds ) => {
149+ const file = PULSE_SOUNDS [ logoAudioShot ++ % PULSE_SOUNDS . length ]
150+ void TuiAudio . loadSoundFile ( file )
151+ . then ( ( sound ) => {
177152 if ( id !== logoAudioSeq ) return
178- const sound = sounds . pulse [ logoAudioShot ++ % PULSE_SOUNDS . length ]
179153 if ( sound == null ) return
180- audio . play ( sound , { volume : 0.26 + 0.14 * scale } )
154+ TuiAudio . play ( sound , { volume : 0.26 + 0.14 * scale } )
181155 } )
182156 . catch ( ( ) => undefined )
183157}
184158
185159function disposeLogoSound ( ) {
186160 stopLogoSound ( )
187- logoAudio ?. dispose ( )
188- logoAudio = undefined
189- logoAudioSounds = undefined
190161}
191162
192163type Ring = {
0 commit comments