@@ -138,7 +138,10 @@ func (c *Channel) AddPlayer(w av.WriteCloser) error {
138138 if c .Closed () {
139139 return ErrClosed
140140 }
141- c .players .Store (w , newPackWriterCloser (w ))
141+ _ , loaded := c .players .LoadOrStore (w , newPackWriterCloser (w ))
142+ if loaded {
143+ return errors .New ("player already exists" )
144+ }
142145 return nil
143146}
144147
@@ -148,7 +151,10 @@ func (c *Channel) DelPlayer(w av.WriteCloser) error {
148151 if c .Closed () {
149152 return ErrClosed
150153 }
151- c .players .Delete (w )
154+ pw , loaded := c .players .LoadAndDelete (w )
155+ if loaded {
156+ pw .GetWriter ().Close ()
157+ }
152158 return nil
153159}
154160
@@ -173,20 +179,38 @@ func (c *Channel) InitHlsPlayer() error {
173179 return ErrClosed
174180 }
175181 c .hlsOnce .Do (func () {
176- if c .InitdHlsPlayer () {
177- return
178- }
179- w := hls .NewSource ()
180- atomic .StorePointer ((* unsafe .Pointer )(unsafe .Pointer (& c .hlsWriter )), unsafe .Pointer (w ))
181- go c .hlsWriter .SendPacket ()
182- if err := c .AddPlayer (c .hlsWriter ); err != nil {
183- c .hlsWriter .Close ()
184- return
185- }
182+ p := hls .NewSource ()
183+ atomic .StorePointer ((* unsafe .Pointer )(unsafe .Pointer (& c .hlsWriter )), unsafe .Pointer (p ))
184+ go func () {
185+ for {
186+ if c .Closed () {
187+ return
188+ }
189+ if err := c .AddPlayer (p ); err != nil {
190+ p .Close ()
191+ continue
192+ }
193+ p .SendPacket ()
194+ p .Close ()
195+ if c .Closed () {
196+ return
197+ }
198+ p = hls .NewSource ()
199+ atomic .StorePointer ((* unsafe .Pointer )(unsafe .Pointer (& c .hlsWriter )), unsafe .Pointer (p ))
200+ }
201+ }()
186202 })
187203 return nil
188204}
189205
206+ func (c * Channel ) HlsPlayer () * hls.Source {
207+ w := atomic .LoadPointer ((* unsafe .Pointer )(unsafe .Pointer (& c .hlsWriter )))
208+ if w == nil {
209+ return nil
210+ }
211+ return (* hls .Source )(w )
212+ }
213+
190214func (c * Channel ) InitdHlsPlayer () bool {
191215 w := atomic .LoadPointer ((* unsafe .Pointer )(unsafe .Pointer (& c .hlsWriter )))
192216 return w != nil
@@ -198,14 +222,14 @@ func (c *Channel) GenM3U8PlayList(tsBashPath string) (*bytes.Buffer, error) {
198222 if ! c .InitdHlsPlayer () {
199223 return nil , ErrHlsPlayerNotInit
200224 }
201- return c .hlsWriter .GetCacheInc ().GenM3U8PlayList (tsBashPath ), nil
225+ return c .HlsPlayer () .GetCacheInc ().GenM3U8PlayList (tsBashPath ), nil
202226}
203227
204228func (c * Channel ) GetTsFile (tsName string ) ([]byte , error ) {
205229 if ! c .InitdHlsPlayer () {
206230 return nil , ErrHlsPlayerNotInit
207231 }
208- t , err := c .hlsWriter .GetCacheInc ().GetItem (tsName )
232+ t , err := c .HlsPlayer () .GetCacheInc ().GetItem (tsName )
209233 if err != nil {
210234 return nil , err
211235 }
0 commit comments