| 94 | } |
| 95 | |
| 96 | func manageBridge(ctx context.Context, h *ari.BridgeHandle, wg *sync.WaitGroup) { |
| 97 | // Delete the bridge when we exit |
| 98 | defer h.Delete() |
| 99 | |
| 100 | destroySub := h.Subscribe(ari.Events.BridgeDestroyed) |
| 101 | defer destroySub.Cancel() |
| 102 | |
| 103 | enterSub := h.Subscribe(ari.Events.ChannelEnteredBridge) |
| 104 | defer enterSub.Cancel() |
| 105 | |
| 106 | leaveSub := h.Subscribe(ari.Events.ChannelLeftBridge) |
| 107 | defer leaveSub.Cancel() |
| 108 | |
| 109 | wg.Done() |
| 110 | for { |
| 111 | select { |
| 112 | case <-ctx.Done(): |
| 113 | return |
| 114 | case <-destroySub.Events(): |
| 115 | log.Debug("bridge destroyed") |
| 116 | return |
| 117 | case e, ok := <-enterSub.Events(): |
| 118 | if !ok { |
| 119 | log.Error("channel entered subscription closed") |
| 120 | return |
| 121 | } |
| 122 | v := e.(*ari.ChannelEnteredBridge) |
| 123 | log.Debug("channel entered bridge", "channel", v.Channel.Name) |
| 124 | go func() { |
| 125 | if err := play.Play(ctx, h, play.URI("sound:confbridge-join")).Err(); err != nil { |
| 126 | log.Error("failed to play join sound", "error", err) |
| 127 | } |
| 128 | }() |
| 129 | case e, ok := <-leaveSub.Events(): |
| 130 | if !ok { |
| 131 | log.Error("channel left subscription closed") |
| 132 | return |
| 133 | } |
| 134 | v := e.(*ari.ChannelLeftBridge) |
| 135 | log.Debug("channel left bridge", "channel", v.Channel.Name) |
| 136 | go func() { |
| 137 | if err := play.Play(ctx, h, play.URI("sound:confbridge-leave")).Err(); err != nil { |
| 138 | log.Error("failed to play leave sound", "error", err) |
| 139 | } |
| 140 | }() |
| 141 | } |
| 142 | } |
| 143 | } |