mirror of
https://github.com/onyx-and-iris/voicemeeter.git
synced 2024-11-15 17:40:51 +00:00
add support for observers.
init/end pooler on login, logout
This commit is contained in:
parent
d3289dbb80
commit
d7be997fae
26
examples/observer/observer.go
Normal file
26
examples/observer/observer.go
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/onyx-and-iris/voicemeeter-api-go/voicemeeter"
|
||||||
|
)
|
||||||
|
|
||||||
|
type observer struct{}
|
||||||
|
|
||||||
|
func (o observer) OnUpdate(subject string) {
|
||||||
|
fmt.Println(subject)
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
vmRem := voicemeeter.GetRemote("banana")
|
||||||
|
vmRem.Login()
|
||||||
|
|
||||||
|
o := observer{}
|
||||||
|
vmRem.Pooler.Publisher.Register(o)
|
||||||
|
|
||||||
|
time.Sleep(10 * time.Second)
|
||||||
|
|
||||||
|
vmRem.Logout()
|
||||||
|
}
|
56
voicemeeter/publisher.go
Normal file
56
voicemeeter/publisher.go
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
package voicemeeter
|
||||||
|
|
||||||
|
type observer interface {
|
||||||
|
OnUpdate(subject string)
|
||||||
|
}
|
||||||
|
|
||||||
|
type Publisher struct {
|
||||||
|
observerList []observer
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *Publisher) Register(o observer) {
|
||||||
|
p.observerList = append(p.observerList, o)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *Publisher) Deregister(o observer) {
|
||||||
|
var indexToRemove int
|
||||||
|
|
||||||
|
for i, observer := range p.observerList {
|
||||||
|
if observer == o {
|
||||||
|
indexToRemove = i
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
p.observerList = append(p.observerList[:indexToRemove], p.observerList[indexToRemove+1:]...)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *Publisher) notify(subject string) {
|
||||||
|
for _, observer := range p.observerList {
|
||||||
|
observer.OnUpdate(subject)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
type Pooler struct {
|
||||||
|
run bool
|
||||||
|
Publisher
|
||||||
|
}
|
||||||
|
|
||||||
|
func newPooler() *Pooler {
|
||||||
|
p := &Pooler{
|
||||||
|
run: true,
|
||||||
|
}
|
||||||
|
go p.runner()
|
||||||
|
return p
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *Pooler) runner() {
|
||||||
|
for r.run {
|
||||||
|
if pdirty() {
|
||||||
|
r.Publisher.notify("pdirty")
|
||||||
|
}
|
||||||
|
if mdirty() {
|
||||||
|
r.Publisher.notify("mdirty")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -14,6 +14,8 @@ type remote struct {
|
|||||||
Button []button
|
Button []button
|
||||||
Command *command
|
Command *command
|
||||||
Vban *vban
|
Vban *vban
|
||||||
|
|
||||||
|
Pooler *Pooler
|
||||||
}
|
}
|
||||||
|
|
||||||
// String implements the stringer interface
|
// String implements the stringer interface
|
||||||
@ -22,10 +24,12 @@ func (r *remote) String() string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (r *remote) Login() {
|
func (r *remote) Login() {
|
||||||
|
r.Pooler = newPooler()
|
||||||
login(r.kind.name)
|
login(r.kind.name)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *remote) Logout() {
|
func (r *remote) Logout() {
|
||||||
|
r.Pooler.run = false
|
||||||
logout()
|
logout()
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -117,15 +121,13 @@ func (b *genericBuilder) makeButton() remoteBuilder {
|
|||||||
|
|
||||||
func (b *genericBuilder) makeCommand() remoteBuilder {
|
func (b *genericBuilder) makeCommand() remoteBuilder {
|
||||||
fmt.Println("building command")
|
fmt.Println("building command")
|
||||||
_command := newCommand()
|
b.r.Command = newCommand()
|
||||||
b.r.Command = _command
|
|
||||||
return b
|
return b
|
||||||
}
|
}
|
||||||
|
|
||||||
func (b *genericBuilder) makeVban() remoteBuilder {
|
func (b *genericBuilder) makeVban() remoteBuilder {
|
||||||
fmt.Println("building vban")
|
fmt.Println("building vban")
|
||||||
_vban := newVban(b.k)
|
b.r.Vban = newVban(b.k)
|
||||||
b.r.Vban = _vban
|
|
||||||
return b
|
return b
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user