fix bugs in done signalling

This commit is contained in:
Drew Weymouth
2025-07-26 22:25:01 -07:00
parent b9ef1e86a4
commit 777ec95cfd
+11 -10
View File
@@ -37,6 +37,7 @@ type WaveformImageJob struct {
img *WaveformImage img *WaveformImage
err error err error
progress int // first invalid pixel in X direction progress int // first invalid pixel in X direction
done bool
cancel func() cancel func()
} }
@@ -49,7 +50,7 @@ func (w *WaveformImageJob) Cancel() {
func (w *WaveformImageJob) Done() bool { func (w *WaveformImageJob) Done() bool {
w.lock.Lock() w.lock.Lock()
defer w.lock.Unlock() defer w.lock.Unlock()
return w.err != nil || w.progress >= w.img.Bounds().Dx() return w.err != nil || w.done
} }
func (w *WaveformImageJob) Err() error { func (w *WaveformImageJob) Err() error {
@@ -172,9 +173,12 @@ type waveformData struct {
RMS [1024]byte RMS [1024]byte
progress int // first invalid index for Peak/RMS data progress int // first invalid index for Peak/RMS data
done bool
} }
func generateWaveformImage(ctx context.Context, data *waveformData, job *WaveformImageJob) { func generateWaveformImage(ctx context.Context, data *waveformData, job *WaveformImageJob) {
defer func() { job.done = true }()
centerY := job.img.Rect.Dy() / 2 // 16 centerY := job.img.Rect.Dy() / 2 // 16
top := centerY - 1 top := centerY - 1
bottom := centerY bottom := centerY
@@ -184,11 +188,13 @@ func generateWaveformImage(ctx context.Context, data *waveformData, job *Wavefor
for x := 0; x < 1024; x++ { for x := 0; x < 1024; x++ {
for data.progress <= x { for data.progress <= x {
time.Sleep(10 * time.Millisecond) if data.done {
return
}
if ctx.Err() != nil { if ctx.Err() != nil {
return // expired return // expired
} }
continue time.Sleep(10 * time.Millisecond)
} }
rms := float64(data.RMS[x]) / 255.0 rms := float64(data.RMS[x]) / 255.0
@@ -214,14 +220,12 @@ func generateWaveformImage(ctx context.Context, data *waveformData, job *Wavefor
} }
job.progress = x + 1 job.progress = x + 1
} }
log.Println("done generating image")
} }
// assumes mono, 16 bit // assumes mono, 16 bit
func analyzeWavFile(ctx context.Context, transcodeFile string, data *waveformData, millisecs int64, fileDone func() bool) error { func analyzeWavFile(ctx context.Context, transcodeFile string, data *waveformData, millisecs int64, fileDone func() bool) error {
if fileDone() { defer func() { data.done = true }()
log.Println("Analyzing completely written file!!")
}
f, err := os.Open(transcodeFile) f, err := os.Open(transcodeFile)
if err != nil { if err != nil {
log.Println("error opening transcoded file") log.Println("error opening transcoded file")
@@ -290,7 +294,6 @@ func analyzeWavFile(ctx context.Context, transcodeFile string, data *waveformDat
n, err := decoder.PCMBuffer(buf) n, err := decoder.PCMBuffer(buf)
if n == 0 || err == io.EOF { if n == 0 || err == io.EOF {
if fileDone() { if fileDone() {
data.progress = 1024 // set progress to done
break break
} }
if err == io.EOF && !fileDone() { if err == io.EOF && !fileDone() {
@@ -331,8 +334,6 @@ func analyzeWavFile(ctx context.Context, transcodeFile string, data *waveformDat
data.progress = curChunk + 1 data.progress = curChunk + 1
} }
log.Println("final chunk is", curChunk)
return nil return nil
} }