internal/pipewire: implement Core::CreateObject
All checks were successful
Test / Create distribution (push) Successful in 42s
Test / Sandbox (push) Successful in 3m23s
Test / Hakurei (push) Successful in 4m49s
Test / Sandbox (race detector) (push) Successful in 5m28s
Test / Hpkg (push) Successful in 6m12s
Test / Hakurei (race detector) (push) Successful in 6m37s
Test / Flake checks (push) Successful in 1m34s
All checks were successful
Test / Create distribution (push) Successful in 42s
Test / Sandbox (push) Successful in 3m23s
Test / Hakurei (push) Successful in 4m49s
Test / Sandbox (race detector) (push) Successful in 5m28s
Test / Hpkg (push) Successful in 6m12s
Test / Hakurei (race detector) (push) Successful in 6m37s
Test / Flake checks (push) Successful in 1m34s
Nothing uses this right now, this would have to be called by wrapper methods on Registry that would search the objects Signed-off-by: Ophestra <cat@gensokyo.uk>
This commit is contained in:
@@ -572,6 +572,58 @@ func (ctx *Context) GetRegistry() (*Registry, error) {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// CoreCreateObject is sent when the client requests to create a
|
||||||
|
// new object from a factory of a certain type.
|
||||||
|
//
|
||||||
|
// The client allocates a new_id for the proxy. The server will
|
||||||
|
// allocate a new resource with the same new_id and from then on,
|
||||||
|
// Methods and Events will be exchanged between the new object of
|
||||||
|
// the given type.
|
||||||
|
type CoreCreateObject struct {
|
||||||
|
// The name of a server factory object to use.
|
||||||
|
FactoryName String `json:"factory_name"`
|
||||||
|
// The type of the object to create, this is also the type of
|
||||||
|
// the interface of the new_id proxy.
|
||||||
|
Type String `json:"type"`
|
||||||
|
// Undocumented, assumed to be the local version of the proxy.
|
||||||
|
Version Int `json:"version"`
|
||||||
|
// Extra properties to create the object.
|
||||||
|
Properties *SPADict `json:"props"`
|
||||||
|
// The proxy id of the new object.
|
||||||
|
NewID Int `json:"new_id"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// Opcode satisfies [Message] with a constant value.
|
||||||
|
func (c *CoreCreateObject) Opcode() byte { return PW_CORE_METHOD_CREATE_OBJECT }
|
||||||
|
|
||||||
|
// FileCount satisfies [Message] with a constant value.
|
||||||
|
func (c *CoreCreateObject) FileCount() Int { return 0 }
|
||||||
|
|
||||||
|
// Size satisfies [KnownSize] with a value computed at runtime.
|
||||||
|
func (c *CoreCreateObject) Size() Word {
|
||||||
|
return SizePrefix +
|
||||||
|
SizeString[Word](c.FactoryName) +
|
||||||
|
SizeString[Word](c.Type) +
|
||||||
|
Size(SizeInt) +
|
||||||
|
c.Properties.Size() +
|
||||||
|
Size(SizeInt)
|
||||||
|
}
|
||||||
|
|
||||||
|
// MarshalBinary satisfies [encoding.BinaryMarshaler] via [Marshal].
|
||||||
|
func (c *CoreCreateObject) MarshalBinary() ([]byte, error) { return Marshal(c) }
|
||||||
|
|
||||||
|
// UnmarshalBinary satisfies [encoding.BinaryUnmarshaler] via [Unmarshal].
|
||||||
|
func (c *CoreCreateObject) UnmarshalBinary(data []byte) error { return Unmarshal(data, c) }
|
||||||
|
|
||||||
|
// createObject queues a [CoreCreateObject] message for the PipeWire server.
|
||||||
|
// This is not safe to use directly, callers should use typed wrapper methods on [Registry] instead.
|
||||||
|
func (core *Core) createObject(factoryName, typeName String, version Int, props SPADict, newId Int) error {
|
||||||
|
return core.ctx.writeMessage(
|
||||||
|
PW_ID_CORE,
|
||||||
|
&CoreCreateObject{factoryName, typeName, version, &props, newId},
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
// A RegistryGlobal event is emitted to notify a client about a new global object.
|
// A RegistryGlobal event is emitted to notify a client about a new global object.
|
||||||
type RegistryGlobal struct {
|
type RegistryGlobal struct {
|
||||||
// The global id.
|
// The global id.
|
||||||
|
|||||||
@@ -171,7 +171,7 @@ func TestCoreError(t *testing.T) {
|
|||||||
/* padding */ 0, 0, 0, 0,
|
/* padding */ 0, 0, 0, 0,
|
||||||
|
|
||||||
/* size: 0x1b bytes */ 0x1b, 0, 0, 0,
|
/* size: 0x1b bytes */ 0x1b, 0, 0, 0,
|
||||||
/*type: String */ 8, 0, 0, 0,
|
/* type: String */ 8, 0, 0, 0,
|
||||||
|
|
||||||
// value: "no permission to destroy 0\x00"
|
// value: "no permission to destroy 0\x00"
|
||||||
0x6e, 0x6f, 0x20, 0x70,
|
0x6e, 0x6f, 0x20, 0x70,
|
||||||
@@ -306,6 +306,60 @@ func TestCoreGetRegistry(t *testing.T) {
|
|||||||
}.run(t)
|
}.run(t)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestCoreCreateObject(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
encodingTestCases[pipewire.CoreCreateObject, *pipewire.CoreCreateObject]{
|
||||||
|
{"sample", []byte{
|
||||||
|
/* size: rest of data */ 0x70, 0, 0, 0,
|
||||||
|
/* type: Struct */ 0xe, 0, 0, 0,
|
||||||
|
|
||||||
|
/* size: 0x13 bytes */ 0x13, 0, 0, 0,
|
||||||
|
/* type: String */ 8, 0, 0, 0,
|
||||||
|
|
||||||
|
// value: "spa-device-factory\x00"
|
||||||
|
0x73, 0x70, 0x61, 0x2d,
|
||||||
|
0x64, 0x65, 0x76, 0x69,
|
||||||
|
0x63, 0x65, 0x2d, 0x66,
|
||||||
|
0x61, 0x63, 0x74, 0x6f,
|
||||||
|
0x72, 0x79, 0, 0,
|
||||||
|
0, 0, 0, 0,
|
||||||
|
|
||||||
|
/* size: 0x1a bytes */ 0x1a, 0, 0, 0,
|
||||||
|
/* type: String */ 8, 0, 0, 0,
|
||||||
|
|
||||||
|
// value: "PipeWire:Interface:Device\x00"
|
||||||
|
0x50, 0x69, 0x70, 0x65,
|
||||||
|
0x57, 0x69, 0x72, 0x65,
|
||||||
|
0x3a, 0x49, 0x6e, 0x74,
|
||||||
|
0x65, 0x72, 0x66, 0x61,
|
||||||
|
0x63, 0x65, 0x3a, 0x44,
|
||||||
|
0x65, 0x76, 0x69, 0x63,
|
||||||
|
0x65, 0, 0, 0,
|
||||||
|
0, 0, 0, 0,
|
||||||
|
|
||||||
|
/* size: 4 bytes */ 4, 0, 0, 0,
|
||||||
|
/* type: Int */ 4, 0, 0, 0,
|
||||||
|
/* value: 3 */ 3, 0, 0, 0,
|
||||||
|
/* padding */ 0, 0, 0, 0,
|
||||||
|
|
||||||
|
/* size */ 0, 0, 0, 0,
|
||||||
|
/* type: None */ 1, 0, 0, 0,
|
||||||
|
|
||||||
|
/* size: 4 bytes */ 4, 0, 0, 0,
|
||||||
|
/* type: Int */ 4, 0, 0, 0,
|
||||||
|
/* value: 0xbad */ 0xad, 0xb, 0, 0,
|
||||||
|
/* padding */ 0, 0, 0, 0,
|
||||||
|
}, pipewire.CoreCreateObject{
|
||||||
|
FactoryName: "spa-device-factory",
|
||||||
|
Type: pipewire.PW_TYPE_INTERFACE_Device,
|
||||||
|
Version: pipewire.PW_VERSION_FACTORY,
|
||||||
|
Properties: new(pipewire.SPADict),
|
||||||
|
NewID: 0xbad,
|
||||||
|
}, nil},
|
||||||
|
}.run(t)
|
||||||
|
}
|
||||||
|
|
||||||
func TestRegistryGlobal(t *testing.T) {
|
func TestRegistryGlobal(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user