我正在创建一个音频项目作为学术练习 - 我想将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_buffer
和CoreAudio.default_output_device.output_stream
之类的内容,通过复制示例,我可以通过CoreAudio.default_output_device.output_buffer
获得一些声音。 default_input_device
和default_output_device
是CoreAudio::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的定义。除了查看示例之外,我怎么知道如何使用它?
请帮助我理解我错过的内容。
答案 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特有的技术)