首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用libpd在Android中播放wave文件

用libpd在Android中播放wave文件
EN

Stack Overflow用户
提问于 2015-07-17 02:56:56
回答 3查看 581关注 0票数 2

如何使用libpd在Android中播放wave文件?我可以用soundpool.play来做这件事,但是我想试试libpd。我跟随this tutorial实现了libpd,但它不起作用。会出什么问题呢?代码还是警局补丁?

这是我的活动代码:

代码语言:javascript
复制
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补丁:

代码语言:javascript
复制
#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;
EN

回答 3

Stack Overflow用户

发布于 2015-08-26 18:25:39

错误在Pd-patch中:

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

然而,在补丁中似乎没有一个接收器附加到这个名字上,所以甚至不会在Pd中触发任何东西。

  • 您有另一个由bng对象触发的标签(但它也只会发送到空)。
  • [bng]对象可能有一个接收标签集,但

代码语言:javascript
复制
- according to the screenshot it has _no_ receive-label set at all (the inlet would vanish if so; but it's a bit hard to read).
- If you did have a receive-label `mybang`, then clicking on `[bng]` would trigger an infinite recursion (`[bng]` => `[s mybang]` -> `[bng]` ...)

一般错误

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

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

解决方案

因此,补丁应该看起来像这样:

代码语言:javascript
复制
[bng]
|
[s mybang]

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

Stack Overflow用户

发布于 2015-08-24 05:07:20

在集成到android之前,补丁单独起作用了吗?如果是这样,请尝试通过android使用另一个按钮启用DSP,并将其发送到永久修补或移除DSP ON切换框并启用DSP ON。

票数 0
EN

Stack Overflow用户

发布于 2016-02-19 04:52:47

在Peter Brinkmann的“制作音乐应用程序”一书中

他建议:

如果您的修补程序使用其他资源,如wav文件或抽象,则最佳做法是将这些资源与修补程序打包,并仅通过相对路径引用它们。

换句话说:将所有文件夹内容压缩到一个压缩文件中,这样在Android中解压时,所有资源都将在同一个文件夹中,pd补丁将能够找到你的.wav或其他文件。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31462357

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档