Skip to main content
Glama
emicklei

melrōse musical expression player

by emicklei
registry_stream.go1.41 kB
package midi import ( "sync" "github.com/emicklei/melrose/midi/transport" ) type streamRegistry struct { mutex *sync.RWMutex out map[int]transport.MIDIOut in map[int]transport.MIDIIn transport transport.Transporter } func newStreamRegistry() *streamRegistry { return &streamRegistry{ mutex: new(sync.RWMutex), out: map[int]transport.MIDIOut{}, in: map[int]transport.MIDIIn{}, transport: transport.Factory(), } } func (s *streamRegistry) output(id int) (transport.MIDIOut, error) { s.mutex.RLock() if m, ok := s.out[id]; ok { s.mutex.RUnlock() return m, nil } s.mutex.RUnlock() // not present s.mutex.Lock() defer s.mutex.Unlock() out, err := s.transport.NewMIDIOut(id) if err != nil { return nil, err } s.out[id] = out return out, nil } func (s *streamRegistry) input(id int) (transport.MIDIIn, error) { s.mutex.RLock() if m, ok := s.in[id]; ok { s.mutex.RUnlock() return m, nil } s.mutex.RUnlock() // not present s.mutex.Lock() defer s.mutex.Unlock() in, err := s.transport.NewMIDIIn(id) if err != nil { return nil, err } s.in[id] = in return in, nil } func (s *streamRegistry) close() error { s.mutex.Lock() defer s.mutex.Unlock() for _, each := range s.in { each.Close() } for _, each := range s.out { each.Close() } s.out = map[int]transport.MIDIOut{} s.in = map[int]transport.MIDIIn{} return nil }

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/emicklei/melrose'

If you have feedback or need assistance with the MCP directory API, please join our Discord server