fix bugs in done signalling
This commit is contained in:
+11
-10
@@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user