我如何使用libpd在Android中播放wave文件?我可以使用soundpool.play
执行此操作,但我想尝试使用libpd。我跟着this tutorial实现了libpd,但它没有用。有什么不对?代码或PD补丁?
这是我的活动代码:
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补丁:
#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;
答案 0 :(得分:1)
错误发生在Pd-patch中:
您正在向Pd-patch中的mybang
符号发送一声巨响。
然而,在补丁中似乎没有附加到该名称的接收器,因此甚至不会在Pd内触发任何内容。
您有另一个由[send mybang]
对象触发的bng
(但也会发送到虚空)。
[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~ ]
答案 1 :(得分:0)
在整合到android之前,补丁是否单独工作?如果是这样,尝试使用另一个按钮通过Android启用DSP,并将其发送到补丁或永久删除DSP ON切换框并使DSP打开。
答案 2 :(得分:0)
Peter Brinkmann撰写的“制作音乐应用”一书
他建议:“如果您的补丁使用其他资源,例如wav文件或抽象,那么最好将这些资源与补丁一起打包,并仅通过相对路径引用它们。”
换句话说: 在一个zip文件中压缩所有文件夹内容,因此在Android中解压缩时,所有资源都将位于同一文件夹中,pd补丁将能够找到您的.wav或其他文件。