mirror of
https://github.com/jahruz67/wisp-open.git
synced 2026-08-08 18:14:08 +00:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1639459293 | ||
|
|
54ec0fb197 |
@@ -144,14 +144,20 @@ func (a *App) Quit() {
|
||||
wailsruntime.Quit(a.ctx)
|
||||
}
|
||||
|
||||
var lastToggle time.Time
|
||||
var lastToggleUnixNano int64
|
||||
|
||||
func (a *App) ToggleRecording() {
|
||||
// Debounce toggle calls to prevent rapid firing from double-binds or Wayland glitches
|
||||
if time.Since(lastToggle) < 500*time.Millisecond {
|
||||
return
|
||||
now := time.Now().UnixNano()
|
||||
for {
|
||||
last := atomic.LoadInt64(&lastToggleUnixNano)
|
||||
if last != 0 && time.Duration(now-last) < 500*time.Millisecond {
|
||||
return
|
||||
}
|
||||
if atomic.CompareAndSwapInt64(&lastToggleUnixNano, last, now) {
|
||||
break
|
||||
}
|
||||
}
|
||||
lastToggle = time.Now()
|
||||
|
||||
if atomic.LoadInt32(&a.recording) == 1 {
|
||||
a.StopRecording()
|
||||
|
||||
@@ -254,8 +254,15 @@ func (r *AudioRecorder) Cleanup() {
|
||||
|
||||
// onAudioData is called by miniaudio when audio data is available.
|
||||
func (r *AudioRecorder) onAudioData(_, inputSamples []byte, _ uint32) {
|
||||
r.mu.Lock()
|
||||
defer r.mu.Unlock()
|
||||
|
||||
if r.outputFile != nil && len(inputSamples) > 0 {
|
||||
n, _ := r.outputFile.Write(inputSamples)
|
||||
n, err := r.outputFile.Write(inputSamples)
|
||||
if err != nil {
|
||||
logger.Error("Failed to write audio data: %v", err)
|
||||
return
|
||||
}
|
||||
r.dataSize += uint32(n)
|
||||
|
||||
// Calculate volume if callback is set
|
||||
@@ -289,23 +296,49 @@ func (r *AudioRecorder) writeWAVHeader(dataSize uint32) error {
|
||||
blockAlign := numChannels * (bitsPerSample / 8)
|
||||
|
||||
// RIFF chunk
|
||||
r.outputFile.Write([]byte("RIFF"))
|
||||
binary.Write(r.outputFile, binary.LittleEndian, uint32(36+dataSize))
|
||||
r.outputFile.Write([]byte("WAVE"))
|
||||
if _, err := r.outputFile.Write([]byte("RIFF")); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := binary.Write(r.outputFile, binary.LittleEndian, uint32(36+dataSize)); err != nil {
|
||||
return err
|
||||
}
|
||||
if _, err := r.outputFile.Write([]byte("WAVE")); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// fmt sub-chunk
|
||||
r.outputFile.Write([]byte("fmt "))
|
||||
binary.Write(r.outputFile, binary.LittleEndian, uint32(16)) // Subchunk1Size
|
||||
binary.Write(r.outputFile, binary.LittleEndian, uint16(1)) // AudioFormat (PCM)
|
||||
binary.Write(r.outputFile, binary.LittleEndian, numChannels)
|
||||
binary.Write(r.outputFile, binary.LittleEndian, sampleRate)
|
||||
binary.Write(r.outputFile, binary.LittleEndian, byteRate)
|
||||
binary.Write(r.outputFile, binary.LittleEndian, blockAlign)
|
||||
binary.Write(r.outputFile, binary.LittleEndian, bitsPerSample)
|
||||
if _, err := r.outputFile.Write([]byte("fmt ")); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := binary.Write(r.outputFile, binary.LittleEndian, uint32(16)); err != nil { // Subchunk1Size
|
||||
return err
|
||||
}
|
||||
if err := binary.Write(r.outputFile, binary.LittleEndian, uint16(1)); err != nil { // AudioFormat (PCM)
|
||||
return err
|
||||
}
|
||||
if err := binary.Write(r.outputFile, binary.LittleEndian, numChannels); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := binary.Write(r.outputFile, binary.LittleEndian, sampleRate); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := binary.Write(r.outputFile, binary.LittleEndian, byteRate); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := binary.Write(r.outputFile, binary.LittleEndian, blockAlign); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := binary.Write(r.outputFile, binary.LittleEndian, bitsPerSample); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// data sub-chunk
|
||||
r.outputFile.Write([]byte("data"))
|
||||
binary.Write(r.outputFile, binary.LittleEndian, dataSize)
|
||||
if _, err := r.outputFile.Write([]byte("data")); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := binary.Write(r.outputFile, binary.LittleEndian, dataSize); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -89,7 +89,7 @@ func Save(c *Config, configPath string) error {
|
||||
|
||||
// Ensure the directory exists
|
||||
dir := filepath.Dir(configPath)
|
||||
if err := os.MkdirAll(dir, 0755); err != nil {
|
||||
if err := os.MkdirAll(dir, 0700); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -98,7 +98,7 @@ func Save(c *Config, configPath string) error {
|
||||
return err
|
||||
}
|
||||
|
||||
return os.WriteFile(configPath, data, 0644)
|
||||
return os.WriteFile(configPath, data, 0600)
|
||||
}
|
||||
|
||||
// GetConfigPath returns the default configuration file path.
|
||||
|
||||
@@ -74,7 +74,12 @@ func (m *Manager) IsInstalled() bool {
|
||||
return false
|
||||
}
|
||||
|
||||
modelPath := filepath.Join(m.installDir, Models[info.Model].Filename)
|
||||
modelInfo, ok := Models[info.Model]
|
||||
if !ok || modelInfo.Filename == "" {
|
||||
return false
|
||||
}
|
||||
|
||||
modelPath := filepath.Join(m.installDir, modelInfo.Filename)
|
||||
if _, err := os.Stat(modelPath); os.IsNotExist(err) {
|
||||
return false
|
||||
}
|
||||
@@ -265,9 +270,13 @@ func (m *Manager) Transcribe(audioPath string) (string, error) {
|
||||
if err != nil {
|
||||
return "", fmt.Errorf("failed to get installation info: %w", err)
|
||||
}
|
||||
modelInfo, ok := Models[info.Model]
|
||||
if !ok || modelInfo.Filename == "" {
|
||||
return "", fmt.Errorf("invalid installed model: %q", info.Model)
|
||||
}
|
||||
|
||||
binaryPath := m.getBinaryPath()
|
||||
modelFilename := Models[info.Model].Filename
|
||||
modelFilename := modelInfo.Filename
|
||||
|
||||
// Check for model in Release directory first, then main directory
|
||||
modelPath := filepath.Join(m.installDir, "Release", modelFilename)
|
||||
@@ -424,7 +433,9 @@ func downloadFile(url, dest string, progress chan<- DownloadProgress) error {
|
||||
for {
|
||||
n, err := resp.Body.Read(buf)
|
||||
if n > 0 {
|
||||
out.Write(buf[:n])
|
||||
if _, writeErr := out.Write(buf[:n]); writeErr != nil {
|
||||
return writeErr
|
||||
}
|
||||
downloaded += int64(n)
|
||||
if progress != nil && total > 0 {
|
||||
progress <- DownloadProgress{
|
||||
@@ -444,5 +455,3 @@ func downloadFile(url, dest string, progress chan<- DownloadProgress) error {
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user