gpt4 book ai didi

android - 使用 libpd 在 Android 中播放 wave 文件

转载 作者:行者123 更新时间:2023-11-29 01:30:33 26 4
gpt4 key购买 nike

如何使用 libpd 在 Android 中播放 wave 文件?我可以用 soundpool.play 做到这一点,但我想试试 libpd。我关注了this tutorial实现 libpd,但它不起作用。有什么问题?代码还是PD补丁?

这是我的 Activity 代码:

public class MainActivity extends ActionBarActivity implements OnTouchListener {

private PdUiDispatcher dispatcher;

private void initPD() throws IOException {
int sampleRate = AudioParameters.suggestSampleRate();
PdAudio.initAudio(sampleRate, 0, 2, 8, true);

dispatcher = new PdUiDispatcher();
PdBase.setReceiver(dispatcher);
}

private void loadPDPatch() throws IOException {
File dir = getFilesDir();
IoUtils.extractZipResource(getResources().openRawResource(R.raw.playaudio), dir, true);
File pdPatch = new File(dir, "playaudio.pd");
PdBase.openPatch(pdPatch.getAbsolutePath());
}

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

Button bangButton = (Button) findViewById(R.id.bangButton);
bangButton.setOnTouchListener(this);

try {
initPD();
loadPDPatch();
PdAudio.startAudio(this);

} catch (IOException e) {
finish();
}
}

@Override
protected void onResume() {
super.onResume();
PdAudio.startAudio(this);
}

@Override
protected void onPause() {
super.onPause();
PdAudio.stopAudio();
}

@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN)
if(v.getId() == R.id.bangButton) {
PdBase.sendBang("mybang");
}

return false;
}
}

这是我的 pd 补丁:

PureData Patch

#N canvas 0 22 902 577 24;
#X obj 46 24 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 1 1
;
#X obj 47 248 dac~;
#X obj 48 193 readsf~;
#X obj 49 118 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1
-1;
#X msg 42 61 \; pd dsp \$1;
#X msg 50 155 open myfile.wav \, 1;
#X connect 0 0 4 0;
#X connect 2 0 1 0;
#X connect 3 0 5 0;
#X connect 5 0 2 0;

最佳答案

错误在 Pd 补丁中:

您正在向 Pd 补丁中的 mybang 符号发送一个 bang。

但是,补丁中似乎没有附加到该名称的接收器,因此 even 永远不会触发 Pd 中的任何内容。

  • 您有另一个 [send mybang]bng 对象触发(但它也只会发送到 void)。

  • [bng] 对象可能有一个接收标签集,但是

    • 根据屏幕截图,它根本没有设置接收标签(如果是这样,入口将消失;但它有点难以阅读)。

    • 如果您确实有一个接收标签 mybang,那么点击 [bng] 将触发无限递归([bng] => [s mybang] -> [bng] ...)

一般错误

[bng] 的输出:你不应该永远有消息的扇出(你将一个导出连接到多个消息入口)因为这会导致未定义执行顺序;在这些情况下使用 [trigger]

[readsf~] 的最后一个导出:[readsf~] 默认是一个 mono 播放器;每当声音文件播放完毕时,该对象的最后一个导出都会给您一个 bang ;将 bang 发送到 [dac~] 的第二个入口(期待信号)是错误的。如果你想要一个立体声文件播放器,使用[readsf~ 2]

解决方案

所以补丁应该看起来像:

[bng]
|
[s mybang]

[r mybang]
|
[open myfile.wav, 1(
|
[readsf~ 2]
| |
[dac~ ]

关于android - 使用 libpd 在 Android 中播放 wave 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31462357/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com