mirror of
https://github.com/pion/mediadevices.git
synced 2026-04-22 15:57:27 +08:00
Fix data race in drivers
This commit is contained in:
committed by
Lukas Herman
parent
2bac44aa8a
commit
33b2964733
@@ -44,9 +44,11 @@ func (d *dummy) AudioRecord(p prop.Media) (audio.Reader, error) {
|
||||
nextReadTime := time.Now()
|
||||
var phase int
|
||||
|
||||
closed := d.closed
|
||||
|
||||
reader := audio.ReaderFunc(func(samples [][2]float32) (int, error) {
|
||||
select {
|
||||
case <-d.closed:
|
||||
case <-closed:
|
||||
return 0, io.EOF
|
||||
default:
|
||||
}
|
||||
|
||||
@@ -123,6 +123,8 @@ func (c *camera) VideoRecord(p prop.Media) (video.Reader, error) {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
cam := c.cam
|
||||
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
c.cancel = cancel
|
||||
var buf []byte
|
||||
@@ -138,7 +140,7 @@ func (c *camera) VideoRecord(p prop.Media) (video.Reader, error) {
|
||||
return nil, io.EOF
|
||||
}
|
||||
|
||||
err := c.cam.WaitForFrame(5) // 5 seconds
|
||||
err := cam.WaitForFrame(5) // 5 seconds
|
||||
switch err.(type) {
|
||||
case nil:
|
||||
case *webcam.Timeout:
|
||||
@@ -148,7 +150,7 @@ func (c *camera) VideoRecord(p prop.Media) (video.Reader, error) {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
b, err := c.cam.ReadFrame()
|
||||
b, err := cam.ReadFrame()
|
||||
if err != nil {
|
||||
// Camera has been stopped.
|
||||
return nil, err
|
||||
|
||||
@@ -66,10 +66,11 @@ func (s *screen) VideoRecord(p prop.Media) (video.Reader, error) {
|
||||
s.tick = time.NewTicker(time.Duration(float32(time.Second) / p.FrameRate))
|
||||
|
||||
var dst image.RGBA
|
||||
reader := s.reader
|
||||
|
||||
r := video.ReaderFunc(func() (image.Image, error) {
|
||||
<-s.tick.C
|
||||
return s.reader.Read().ToRGBA(&dst), nil
|
||||
return reader.Read().ToRGBA(&dst), nil
|
||||
})
|
||||
return r, nil
|
||||
}
|
||||
|
||||
@@ -99,16 +99,18 @@ func (d *dummy) VideoRecord(p prop.Media) (video.Reader, error) {
|
||||
}
|
||||
random := rand.New(rand.NewSource(0))
|
||||
|
||||
d.tick = time.NewTicker(time.Duration(float32(time.Second) / p.FrameRate))
|
||||
tick := time.NewTicker(time.Duration(float32(time.Second) / p.FrameRate))
|
||||
d.tick = tick
|
||||
closed := d.closed
|
||||
|
||||
r := video.ReaderFunc(func() (image.Image, error) {
|
||||
select {
|
||||
case <-d.closed:
|
||||
case <-closed:
|
||||
return nil, io.EOF
|
||||
default:
|
||||
}
|
||||
|
||||
<-d.tick.C
|
||||
<-tick.C
|
||||
|
||||
copy(yy, yyBase)
|
||||
copy(cb, cbBase)
|
||||
|
||||
Reference in New Issue
Block a user