将float数组指针传递给python扩展/包装器 - SndObj-library

时间:2015-09-14 17:28:44

标签: python c++ python-2.7 pointers python-extensions

所以我觉得Google已经厌倦了试图帮助我解决这个问题。

我一直在尝试使用SndObj库进行一些实验,更具体地说是它的python包装器。

这个库非常友好,可以包含一个python示例来玩,唯一的问题是让它工作。下面的最后一行给了我一个受伤的世界:

from sndobj import SndObj, SndRTIO, HarmTable, Oscili, SND_OUTPUT
from scipy import zeros, pi, sin, float32
import numpy

sine = numpy.array([256],float32)
for i in range(sine.size):
    sine[i] = 0.5 * sin((2 * pi * i) / sine.size)
    sine *= 32768

obj = SndObj()
obj.PushIn(sine,256)

在原始代码中:

obj.PushIn(sine)

这给了我错误

  

TypeError:SndObj_PushIn()只需3个参数(给定2个)

好吧,公平。我检查(自动生成的)文档和一些Web上的示例代码,发现它还需要一个整数 size 。说完了(我喜欢他们的方式,我猜测的是至少,在例子中注明日期代码)。

无论如何,新论点;新错误:

  

TypeError:在方法' SndObj_PushIn'中,类型'浮动*'

的参数2

我在c ++中根本没有经验,我相信这是图书馆"本地人" (请原谅我缺乏适当的术语)语言,但我很确定我已经知道它想要一个浮点数组/向量作为它的第二个参数(第一个是 self ) 。但是,我很难完成这件事。我已经拥有了浮点数组/向量吗?除此之外,我还尝试在第一行使用 float 而不是 float32 ,在第四行使用 float(32768)无济于事。

非常感谢任何帮助,建议或提示!

编辑: 不确定浮动矢量/数组部分并再次转到自动文档:

int SndObj::PushIn  (   float *     vector,
int     size 
)

所以我说至少c ++想要一个浮点数组/向量,尽管我对python包装器当然还是错的。

更新 根据Prune的请求(说错误消息不是要求浮动向量,但是说那是错误),我尝试输入不同的整数( int int32 等)矢量。但是,看到我仍然收到相同的错误信息并记住编辑时,我说它实际上应该是一个浮动向量。

UPDATE2 在从saulspatz获得一些提示后,我已经更改了问题标题和标签以更好地表达我的问题。我也根据这个进行了一些谷歌搜索,但还没有挖出任何有用的东西。

UDATE3 解决

2 个答案:

答案 0 :(得分:1)

实际上,问题恰恰相反:PushIn采用整数数组。错误消息抱怨您给它浮动。试试这个代替你对PushIn的调用

app.config(function($routeProvider){
    $routeProvider
        .when('/home',
        {
            templateUrl: 'views/home.html',
            controller: 'homeCtlr',
            test:'{{test}}',
        })
        .otherwise({
            redirectTo : '/home'
        })
})

然后将int_sine而不是正弦输入到PushIn。

答案 1 :(得分:0)

所以最终设法让它工作(在非常友好的包装作者的帮助下)!

事实证明,sandbox-library中有一个floatArray类,用于将float数组传递给c ++函数。我猜他们在写完numpy-test.py之后就把它包括在内了,这让我陷入了困境。

功能代码:

from sndobj import SndObj, SndRTIO, SND_OUTPUT, floatArray
from scipy import pi, sin

# ---------------------------------------------------------------------------
# Test PushIn

# Create 1 frame of a sine wave in a numpy array
sine = floatArray(256)
for i in range(256):
     sine[i] = float(32768*0.5 * sin((2 * pi * i) / 256))

obj = SndObj()
obj.PushIn(sine,256)

outp = SndRTIO(1, SND_OUTPUT)
outp.SetOutput(1, obj)

# Repeatedly output the 1 frame of sine wave
duration = outp.GetSr() * 2  # 2 seconds
i = 0
vector_size = outp.GetVectorSize()
while i < duration:
    outp.Write()
    i += vector_size