如何使用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;

最佳答案

错误在Pd补丁中:

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

但是,补丁中似乎没有与该名称关联的接收器,因此,甚至不会触发Pd中的任何内容。


您有另一个[send mybang],由bng对象触发(但也会发送到void)。
[bng]对象可能设置了接收标签,但是


根据屏幕截图,它根本没有设置接收标签(如果这样,入口将消失;但是很难读取)。
如果确实有接收标签mybang,则单击[bng]会触发无限递归([bng] => [s mybang]-> [bng] ...)



一般错误

[bng]的输出:您永远都不应扇出消息(将单个出口连接到多个消息入口),因为这会导致执行顺序不确定。在这种情况下,请使用[trigger]

[readsf~]的最后一个出口:[readsf~]默认情况下是单声道播放器;每当声音文件完成播放时,此对象的最后一个出口就会为您提供bang;将bang发送到[dac~]的第二个入口(期望信号)是错误的。
如果需要立体声声音文件播放器,请使用[readsf~ 2]



因此,该补丁应改为:

[bng]
|
[s mybang]

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

10-06 14:38