使用Ruby coreaudio gem

时间:2014-07-30 23:06:55

标签: objective-c ruby gem

我正在创建一个音频项目作为学术练习 - 我想将Ruby用于非rails项目。我在这里遇到了coreaudio gem:https://github.com/nagachika/ruby-coreaudio并且认为它有助于播放我正在制作的音频。但是,有一些基本的东西,我只是没有得到这个宝石。

1)有没有文件?我很乐意通过撰写文档自愿为项目做出贡献,但我担心我缺乏基本的理解。我在这里查看了生成的文档:http://rubydoc.info/gems/coreaudio/但这只是更加神秘。我认为这至少会显示方法原型,但我只看到一个方法CoreAudio::AudioFile:read。这些例子调用了其他不会在这里出现的方法。

2)有哪些方法/有API?示例包含CoreAudio.default_input_device.input_bufferCoreAudio.default_output_device.output_stream之类的内容,通过复制示例,我可以通过CoreAudio.default_output_device.output_buffer获得一些声音。 default_input_devicedefault_output_deviceCoreAudio::AudioDevice的实例。这太棒了,但我不知道CoreAudio::AudioDevice是什么。

3)什么是CoreAudio :: AudioDevice?没有更复杂的工具可供我使用,我为字符串' AudioDevice'而努力。在已安装的gem文件中。我在文件/ext/coreaudio.m中找到了许多实例。代码看起来像C,我认为.m是Objective C项目中某种类型文件的文件后缀。该文件中唯一可以看到字符串' AudioDevice'它不是一个更大的变量名称的一部分(例如:rb_cAudioDevice)在评论中,但我猜测这个客观的C代码被编译成......我不知道是什么。 ..

4)这些Objective C文件在这里做什么? Ruby是哪里的?不应该在这个项目的某个地方用Ruby编写一个或多个文件来定义类CoreAudio :: AudioDevice吗?任何可观大小的唯一.rb文件是lib / coreaudio / audiofile.rb(其中定义了read方法,rdoc中显示的唯一方法)。

5)什么是coreaudio_ext.bundle? gem安装过程创建了一个名为coreaudio_ext.bundle的二进制文件,如果我不得不猜测,它将是编译项目中目标C文件的结果。这个文件在lib / coreaudio / coreaudio.rb中是必需的,因此对Ruby来说必须是重要的,但它对我来说是一个黑盒子。我假设它是一个黑盒子,包含短暂的CoreAudio :: AudioDevice的定义。除了查看示例之外,我怎么知道如何使用它?

请帮助我理解我错过的内容。

1 个答案:

答案 0 :(得分:2)

自从我问起,我将尝试记录我对未来考古学家的答案,他们可能会对同样的问题感到困惑。感谢Neil Slater指出我回答问题所需的重要资源。

1)有没有文件? - 并不是的。 CoreAudio::AudioFile:read函数是rdoc记录的唯一函数,因为其他所有函数都是在C语言的Ruby扩展中实现的,通过此处详细描述的机制:http://media.pragprog.com/titles/ruby3/ext_ruby.pdf。事实证明,已经为大量现有的C库完成了这个过程,以便将它们的功能添加到Ruby中。

2)有哪些方法/有API? - 创建的扩展名相当于以下内容:(更正欢迎)

Module CoreAudio

  class AudioDevice
    attr_reader :devid, :name, :available_sample_rate, :nominal_rate, :input_stream, :output_stream

    def initialize(devIdVal, options)
      ...
    end

    def actual_rate
      ...
    end

    def output_loop(frame)
      ...
    end

    def output_buffer(frame)
      ...
    end

    def input_buffer(frame)
      ...
    end
  end

  class AudioStream
    attr_reader :channels, :buffer_frame_size

    def initialize(devid_val, is_input)
      ...
    end
  end

  class OutLoop
    def []=(index, val)
      ...
    end

    def start
      ...
    end

    def stop
      ...
    end
  end

  class AudioBuffer
    def start
      ...
    end

    def stop
      ...
    end

    def dropped_frame
      ...
    end

    def reset_dropped_frame
      ...
    end

    def space
      ...
    end

  end

  class OutputBuffer
    def <<(nary)
      ...
    end
  end

  class InputBuffer
    def read(num)
      ...
    end
  end

  def devices
    ...
  end

  def default_input_device
    ...
  end

  def default_output_device
    ...
  end

  def set_default_output_device
    ...
  end

  class AudioFile
    def initialize
      ...
    end

    def close
      ...
    end

    def write(data)
      ...
    end

    def read_frames(frame_val)
      ...
    end

    def rate
      ...
    end

    def channels
      ...
    end

    def inner_rate
      ...
    end

    def inner_channels
      ...
    end

  end
end

3)什么是CoreAudio :: AudioDevice? - 我错了字符串&#34; AudioDevice&#34;不作为标识符出现 - 它在C代码中显示如下:

rb_cAudioDevice = rb_define_class_under(rb_mCoreAudio, "AudioDevice", rb_cObject);

这是在模块CoreAudio中声明类AudioDevice。

4)Ruby在哪里? - 这个gem用Rubyaudio扩展Ruby,用C语言编写。

5)什么是coreaudio_ext.bundle?这是编译的C代码。它是coreaudio.rb中宝石所要求的。

require "coreaudio/coreaudio_ext"

.bundle文件是Windows中与.dll文件等效的Mac。 (我不相信有这个gem的Windows实现,因为CoreAudio是Mac特有的技术)