package mic import ( "fmt" "os" "path/filepath" "tea.chunkbyte.com/kato/go-worm/lib/config" ) type fileRecorder struct { path string f *os.File written int64 } func openRecorder(name string) (*fileRecorder, error) { dir, err := Dir() if err != nil { return nil, err } if err := os.MkdirAll(dir, 0o700); err != nil { return nil, err } path := filepath.Join(dir, filepath.Base(name)) f, err := os.OpenFile(path, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0o600) if err != nil { return nil, err } hdr := make([]byte, wavHeaderSize) writeWAVHeader(hdr, 0) if _, err := f.Write(hdr); err != nil { _ = f.Close() return nil, err } return &fileRecorder{path: path, f: f}, nil } func (r *fileRecorder) Write(pcm []byte) error { if len(pcm) == 0 { return nil } if r.written+int64(len(pcm)) > config.MaxUploadSize { return fmt.Errorf("recording exceeds %d bytes", config.MaxUploadSize) } n, err := r.f.Write(pcm) r.written += int64(n) return err } func (r *fileRecorder) Close() (int64, error) { if r.f == nil { return 0, nil } hdr := make([]byte, wavHeaderSize) writeWAVHeader(hdr, int(r.written)) if _, err := r.f.Seek(0, 0); err != nil { _ = r.f.Close() r.f = nil return r.written, err } if _, err := r.f.Write(hdr); err != nil { _ = r.f.Close() r.f = nil return r.written, err } err := r.f.Close() r.f = nil return r.written, err } func (r *fileRecorder) basename() string { return filepath.Base(r.path) }