uplink/app/channels/channel.go

90 lines
2.1 KiB
Go

package channels
import (
"log"
"github.com/cskr/pubsub"
"git.icedream.tech/icedream/uplink/app/media"
pubsubutil "git.icedream.tech/icedream/uplink/app/pubsub"
)
type Channel struct {
InputContainer *media.MediaStreamContainer
InputStreams map[string]*media.MediaStream
OutputContainers map[string]*media.MediaStreamContainer
OutputStreams map[string]*media.MediaStream
Events *pubsub.PubSub
}
func (channel *Channel) AddInputStream(id string) *media.MediaStream {
stream := &media.MediaStream{
PubSubWriter: pubsubutil.NewPubSubWriter(),
}
channel.InputStreams[id] = stream
log.Println("New input stream", id)
channel.Events.Pub(id, "input_stream")
return stream
}
func (channel *Channel) AddOutputStream(id string) *media.MediaStream {
stream := &media.MediaStream{
PubSubWriter: pubsubutil.NewPubSubWriter(),
}
channel.OutputStreams[id] = stream
log.Println("New output stream", id)
channel.Events.Pub(id, "output_stream")
return stream
}
func (channel *Channel) AddOutputContainer(id string) *media.MediaStreamContainer {
stream := &media.MediaStreamContainer{
PubSubWriter: pubsubutil.NewPubSubWriter(),
}
channel.OutputContainers[id] = stream
log.Println("New output container", id)
channel.Events.Pub(id, "output_container")
return stream
}
func (channel *Channel) SetMetadata(data map[string]string) {
channel.Events.Pub(data, "metadata")
}
func (channel *Channel) Metadata() chan map[string]string {
outC := make(chan map[string]string)
go func() {
c := channel.Events.Sub("metadata")
forloop:
for event := range c {
select {
case _, _ = <-outC:
break forloop
case outC <- event.(map[string]string):
}
}
channel.Events.Unsub(c, "metadata")
}()
return outC
}
func NewChannel() *Channel {
ps := pubsub.New(1)
inputContainer := pubsubutil.NewPubSubWriterForTopic(ps, "input_container")
return &Channel{
InputContainer: &media.MediaStreamContainer{
PubSubWriter: inputContainer,
},
InputStreams: map[string]*media.MediaStream{},
OutputContainers: map[string]*media.MediaStreamContainer{},
OutputStreams: map[string]*media.MediaStream{},
Events: pubsub.New(1),
}
}