pulseaudio_simple_ffi 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. checksums.yaml +7 -0
  2. data/lib/pulseaudio_simple_ffi.rb +81 -0
  3. metadata +56 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 324f42050991907e598a07461cd34c8ab769007ea5e0ff7d54eedfcb8fac7ad7
4
+ data.tar.gz: 5e3975522438e7f336b3c00b8516aa7e9cba6c611bdf4d1729e9988537b1ad0b
5
+ SHA512:
6
+ metadata.gz: 1e29605c1749a89f969261c6d536e33687e9c8d7c3186543eabb82c8e5d7e4d0548ad483309168c43f9ac7846c5a12de3cbbb3af269901e7055e9580733e2d11
7
+ data.tar.gz: ba26d196240d5ea0d9c85f0632486b2f6685e7a491b0b620ef827e7015faa5698a314951987eec7b472f65104b7a3c422c7069fd72026436bc84c18d5589b554
@@ -0,0 +1,81 @@
1
+ #!/usr/bin/env ruby
2
+ require 'ffi'
3
+
4
+ module PulseAudioSimpleFFI
5
+ extend FFI::Library
6
+ ffi_lib 'pulse-simple'
7
+
8
+ class IntPtr < FFI::Struct
9
+ layout :value, :int
10
+ end
11
+
12
+ enum :sample_format, [
13
+ :u8, :alaw, :ulaw,
14
+ :s16le, :s16be,
15
+ :f32le, :f32be,
16
+ :s32le, :s32be,
17
+ :s24le, :s24be,
18
+ :s2432le, :s2432be,
19
+ :max, -1,:invalid
20
+ ]
21
+
22
+ enum :stream_direction, [
23
+ :nodirection, # invalid direction
24
+ :playback, # playback stream
25
+ :record, # record stream
26
+ :upload # sample upload stream
27
+ ]
28
+
29
+ class PulseSampleSpec < FFI::Struct
30
+ layout :format, :sample_format,
31
+ :rate, :uint32,
32
+ :channels, :uint8
33
+ end
34
+
35
+ attach_function :simple_new, :pa_simple_new, [
36
+ :string, # server name or NULL for default
37
+ :string, # A descriptive name for this client (application name, ...)
38
+ :stream_direction, # Open this stream for recording or playback?
39
+ :string, # Sink (resp. source) name, or NULL for default
40
+ :string, # A descriptive name for this stream (application name, song title, ...)
41
+ PulseSampleSpec, # The sample type to use
42
+ :pointer, # (UNIMPLEMENTED) The channel map to use, or NULL for default
43
+ :pointer, # (UNIMPLEMENTED) Buffering attributes, or NULL for default
44
+ IntPtr # A pointer where the error code is stored when the routine returns NULL. It is OK to pass NULL here.
45
+ ], :pointer # Returns type pa_simple*, intentionally undefined in user API.
46
+
47
+ attach_function :simple_get_latency, :pa_simple_get_latency, [:pointer,:int], :uint64
48
+ attach_function :simple_write, :pa_simple_write, [:pointer,:strptr,:uint64,IntPtr], :int
49
+ attach_function :simple_free, :pa_simple_free, [:pointer], :void
50
+
51
+ class PulseAudioSimpleO
52
+ def initialize name,desc,server:nil,device:nil,map:nil,buffer:nil,format: :f32le,rate:44100,channels:2
53
+ ps=PulseSampleSpec.new
54
+ ps[:format]=format
55
+ ps[:rate]=rate
56
+ ps[:channels]=channels
57
+ @err=IntPtr.new
58
+ @err[:value]=0
59
+ # "correct form" is commented below, map and buffer unimplemented in active code
60
+ #@handle=PulseAudioSimpleFFI.simple_new(server,name,:playback,device,desc,ps,map,buffer,@err)
61
+ @handle=PulseAudioSimpleFFI.simple_new(server,name,:playback,device,desc,ps,nil,nil,@err)
62
+ throw [@err[:value],'Error in simple_new(), PulseSimpleO.initialize.'] unless 0 == @err[:value]
63
+ end
64
+ def write buf
65
+ @err[:value]=0
66
+ PulseAudioSimpleFFI.simple_write @handle,buf,buf.length,@err
67
+ throw [@err[:value],'Error in simple_write(), PulseSimpleO.write.'] unless 0 == @err[:value]
68
+ end
69
+ def free
70
+ PulseAudioSimpleFFI.simple_free @handle
71
+ @handle=nil
72
+ end
73
+ def latency
74
+ @err[:value]=0
75
+ val=PulseAudioSimpleFFI.simple_get_latency @handle,@err
76
+ throw [@err[:value],'Error in simple_get_latency(), PulseSimpleO.latency.'] unless 0 == @err[:value]
77
+ val
78
+ end
79
+ alias :close :free
80
+ end
81
+ end
metadata ADDED
@@ -0,0 +1,56 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: pulseaudio_simple_ffi
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Benjamin Cook
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2021-04-02 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: ffi
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '1.15'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '1.15'
27
+ description: A Ruby-FFI implementation of the PulseAudio Simple API.
28
+ email: root@baryon.it
29
+ executables: []
30
+ extensions: []
31
+ extra_rdoc_files: []
32
+ files:
33
+ - lib/pulseaudio_simple_ffi.rb
34
+ homepage: https://github.com/Canar/pulseaudio_simple_ffi
35
+ licenses: []
36
+ metadata: {}
37
+ post_install_message:
38
+ rdoc_options: []
39
+ require_paths:
40
+ - lib
41
+ required_ruby_version: !ruby/object:Gem::Requirement
42
+ requirements:
43
+ - - ">="
44
+ - !ruby/object:Gem::Version
45
+ version: '3.0'
46
+ required_rubygems_version: !ruby/object:Gem::Requirement
47
+ requirements:
48
+ - - ">="
49
+ - !ruby/object:Gem::Version
50
+ version: '0'
51
+ requirements: []
52
+ rubygems_version: 3.2.15
53
+ signing_key:
54
+ specification_version: 4
55
+ summary: A Ruby-FFI implementation of the PulseAudio Simple API.
56
+ test_files: []