Chris@0: Chris@0: @0xc4b1c6c44c999206; Chris@0: Chris@0: using Cxx = import "/capnp/c++.capnp"; Chris@21: $Cxx.namespace("piper"); Chris@0: Chris@0: enum InputDomain { Chris@0: timeDomain @0; Chris@0: frequencyDomain @1; Chris@0: } Chris@0: Chris@0: enum SampleType { Chris@0: oneSamplePerStep @0; Chris@0: fixedSampleRate @1; Chris@0: variableSampleRate @2; Chris@0: } Chris@0: Chris@0: enum AdapterFlag { Chris@0: adaptInputDomain @0; Chris@0: adaptChannelCount @1; Chris@0: adaptBufferSize @2; Chris@0: } Chris@0: Chris@0: const adaptAllSafe :List(AdapterFlag) = Chris@0: [ adaptInputDomain, adaptChannelCount ]; Chris@0: Chris@0: const adaptAll :List(AdapterFlag) = Chris@0: [ adaptInputDomain, adaptChannelCount, adaptBufferSize ]; Chris@0: Chris@0: struct RealTime { Chris@0: sec @0 :Int32 = 0; Chris@0: nsec @1 :Int32 = 0; Chris@0: } Chris@0: Chris@0: struct Basic { Chris@0: identifier @0 :Text; Chris@0: name @1 :Text; Chris@0: description @2 :Text; Chris@0: } Chris@0: Chris@0: struct ParameterDescriptor { Chris@0: basic @0 :Basic; Chris@0: unit @1 :Text; Chris@0: minValue @2 :Float32 = 0.0; Chris@0: maxValue @3 :Float32 = 0.0; Chris@0: defaultValue @4 :Float32 = 0.0; Chris@0: isQuantized @5 :Bool = false; Chris@0: quantizeStep @6 :Float32 = 0.0; Chris@0: valueNames @7 :List(Text) = []; Chris@0: } Chris@0: Chris@15: struct ConfiguredOutputDescriptor { Chris@15: unit @0 :Text; Chris@15: hasFixedBinCount @1 :Bool = false; Chris@15: binCount @2 :Int32 = 0; Chris@15: binNames @3 :List(Text) = []; Chris@15: hasKnownExtents @4 :Bool = false; Chris@15: minValue @5 :Float32 = 0.0; Chris@15: maxValue @6 :Float32 = 0.0; Chris@15: isQuantized @7 :Bool = false; Chris@15: quantizeStep @8 :Float32 = 0.0; Chris@15: sampleType @9 :SampleType; Chris@15: sampleRate @10 :Float32 = 0.0; Chris@15: hasDuration @11 :Bool = false; Chris@15: } Chris@15: Chris@0: struct OutputDescriptor { Chris@0: basic @0 :Basic; Chris@15: configured @1 :ConfiguredOutputDescriptor; Chris@0: } Chris@0: Chris@18: struct ExtractorStaticData { Chris@18: key @0 :Text; Chris@0: basic @1 :Basic; Chris@0: maker @2 :Text; Chris@0: copyright @3 :Text; Chris@18: version @4 :Int32; Chris@0: category @5 :List(Text); Chris@0: minChannelCount @6 :Int32; Chris@0: maxChannelCount @7 :Int32; Chris@0: parameters @8 :List(ParameterDescriptor); Chris@0: programs @9 :List(Text); Chris@0: inputDomain @10 :InputDomain; Chris@0: basicOutputInfo @11 :List(Basic); Chris@0: } Chris@0: Chris@0: struct ProcessInput { Chris@0: inputBuffers @0 :List(List(Float32)); Chris@0: timestamp @1 :RealTime; Chris@0: } Chris@0: Chris@0: struct Feature { Chris@0: hasTimestamp @0 :Bool = false; Chris@0: timestamp @1 :RealTime; Chris@0: hasDuration @2 :Bool = false; Chris@0: duration @3 :RealTime; Chris@0: label @4 :Text; Chris@17: featureValues @5 :List(Float32) = []; Chris@0: } Chris@0: Chris@0: struct FeatureSet { Chris@0: struct FSPair { Chris@9: output @0 :Text; Chris@0: features @1 :List(Feature) = []; Chris@0: } Chris@0: featurePairs @0 :List(FSPair); Chris@0: } Chris@0: Chris@18: struct Configuration { Chris@0: struct PVPair { Chris@0: parameter @0 :Text; Chris@0: value @1 :Float32; Chris@0: } Chris@0: parameterValues @0 :List(PVPair); Chris@0: currentProgram @1 :Text; Chris@0: channelCount @2 :Int32; Chris@0: stepSize @3 :Int32; Chris@0: blockSize @4 :Int32; Chris@0: } Chris@0: Chris@18: struct ListRequest { Chris@18: } Chris@18: Chris@8: struct ListResponse { Chris@18: available @0 :List(ExtractorStaticData); Chris@8: } Chris@8: Chris@0: struct LoadRequest { Chris@18: key @0 :Text; Chris@0: inputSampleRate @1 :Float32; Chris@0: adapterFlags @2 :List(AdapterFlag); Chris@0: } Chris@0: Chris@0: struct LoadResponse { Chris@18: handle @0 :Int32; Chris@18: staticData @1 :ExtractorStaticData; Chris@18: defaultConfiguration @2 :Configuration; Chris@0: } Chris@0: Chris@0: struct ConfigurationRequest { Chris@18: handle @0 :Int32; Chris@18: configuration @1 :Configuration; Chris@0: } Chris@0: Chris@0: struct ConfigurationResponse { Chris@18: handle @0 :Int32; Chris@11: outputs @1 :List(OutputDescriptor); Chris@0: } Chris@0: Chris@2: struct ProcessRequest { Chris@18: handle @0 :Int32; Chris@13: processInput @1 :ProcessInput; Chris@2: } Chris@2: Chris@9: struct ProcessResponse { Chris@18: handle @0 :Int32; Chris@9: features @1 :FeatureSet; Chris@9: } Chris@9: Chris@7: struct FinishRequest { Chris@18: handle @0 :Int32; Chris@7: } Chris@7: Chris@20: struct FinishResponse { Chris@20: handle @0 :Int32; Chris@20: features @1 :FeatureSet; Chris@20: } Chris@20: Chris@18: struct Error { Chris@18: code @0 :Int32; Chris@18: message @1 :Text; Chris@18: } Chris@18: Chris@18: struct RpcRequest { Chris@20: # Request bundle for use when using Cap'n Proto serialisation without Chris@20: # Cap'n Proto RPC layer. Chris@0: request :union { Chris@18: list @0 :ListRequest; Chris@0: load @1 :LoadRequest; Chris@0: configure @2 :ConfigurationRequest; Chris@2: process @3 :ProcessRequest; Chris@7: finish @4 :FinishRequest; # getRemainingFeatures and unload Chris@0: } Chris@0: } Chris@0: Chris@18: struct RpcResponse { Chris@20: # Response bundle for use when using Cap'n Proto serialisation without Chris@20: # Cap'n Proto RPC layer. Chris@0: response :union { Chris@18: error @0 :Error; Chris@18: list @1 :ListResponse; Chris@18: load @2 :LoadResponse; Chris@18: configure @3 :ConfigurationResponse; Chris@18: process @4 :ProcessResponse; Chris@20: finish @5 :FinishResponse; Chris@0: } Chris@0: } Chris@0: