質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.58%

SDLを利用したwavファイルを再生させるコード(C)をUnityで再生させる方法

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 770

to2836

score 16

 前提・実現したいこと

⑴Linux上でOpenal(libopenal.so)とSDL(libSDL_mixer.so)ライブラリーを利用してwavファイルをロード、再生させるコード(C言語)を作成
⑵再生させるコードをライブラリーとして生成(libaudio.so)、3つのライブラリをリンクさせてUnityに3つのライブラリをplugin
⑶apkファイル生成
⑷Androidフォンでwavファイルの音を聴く

 試したこと

現在はSDLライブラリーを使用せずに(SDLライブラリーはwavファイルをロードさせる関数を使用するため)サイン波だけを生成させ、Androidフォンからサイン波の音が鳴るとこまで確認出来ました。

 問題

wavファイルはLinux上に位置しているので音を再生させるコードでMix_LoadWav("wavファイルのpath")関数を利用してdataを取り出しBufferに入れ音を再生させるのですが、Androidフォンでテストしたところwavファイルを探し出せないのか音が鳴りません(予想はしていたのですが……)
wavファイルの位置をどのように設定してどのように持ってくればいいのかが分からず困っています。

 該当のソースコード

Linux側での音を再生させるコード(audio.c)

#include<stdio.h>
#include<math.h>
#include "include/al.h"
#include "include/alc.h"
#include "include/SDL_mixer.h"

int open(){
    int i;
    ALuint buffer;
    ALuint source;    
    Mix_Chunk *sound=NULL;
    ALCdevice *device;
    ALCcontext *context;
  
   device=alcOpenDevice(NULL);
    context=alcCreateContext(device,NULL); 
    alcMakeContextCurrent(context);

    Mix_OpenAudio( 22050, MIX_DEFAULT_FORMAT, 2, 4096 );
    sound = Mix_LoadWAV("include/220.wav");//wavファイルをロード
    if( Mix_OpenAudio( 22050, MIX_DEFAULT_FORMAT, 2, 4096 ) == -1 ) 
        return -1;     
        alGenBuffers(1,&buffer);
    //バッファ生成
        alBufferData(buffer, AL_FORMAT_STEREO16, sound->abuf, sound->alen, 44100); 
    //ソース生成
    alGenSources(1,&source);
    //ソースに再生させるバッファを割り当てる
    alSourcei(source,AL_BUFFER,buffer);    
    alSourcei(source, AL_LOOPING, AL_TRUE);
    //ソースに再生
    alSourcePlay(source);
    for(i=0;i<1000000000000;i++){}

        //SDL_mixer 終了
     Mix_CloseAudio();
    //ソースの割り当て解除
    alSourcei(source,AL_BUFFER,0);    
    //ソース廃棄
    alDeleteSources(1,&source);
    //バッファ廃棄
    alDeleteBuffers(1,&buffer);
    //廃棄
    alcMakeContextCurrent(NULL);
    alcDestroyContext(context);
    alcCloseDevice(device);

        return 0;
}


Unity側のコード

using System.Collections;
using System.Collections.Generic;
using UnityEngine.UI;
using UnityEngine;
using System.Runtime.InteropServices;
using System;

public class call : MonoBehaviour


{
    [DllImport("audio")] //自作のライブラリーをインポート
    static extern int open();

    public Text num;


    void Start()
    {
        num.text = open() + "";  //wavファイルを再生させる関数を呼び出す  
    }
    void Update()
    {
    }
}

 補足情報(FW/ツールのバージョンなど)

使用中のPC:mac OS X
開発環境:virtual machine ubuntu 18.04.1 Desktop (Linux)
Unity version:2018.2.0f2
Android Phone Architecture : ARM Cortex-A53

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

これでうまくいくかどうかは分かりませんが、以下のようにファイルパスを引数で渡すのがよろしいかと思います。

// …(略)

int open(const char *filePath){
    // …(略)

    sound = Mix_LoadWAV(filePath);//wavファイルをロード

    // …(略)
}
// …(略)

public class call : MonoBehaviour
{
    [DllImport("audio")]  //自作のライブラリーをインポート
    static extern int open(IntPtr filePath);

    public Text num;

    void Start()
    {
        // 注:事前に再生したいファイルをApplication.temporaryCachePath内にコピーさせておくこと
        IntPtr filePathPtr = Marshal.StringToHGlobalAnsi(Application.temporaryCachePath + "/include/220.wav");
        num.text = open(filePathPtr) + "";  //wavファイルを再生させる関数を呼び出す  
        Marshal.FreeHGlobal(filePathPtr);
    }
    void Update()
    {
    }
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/11/17 12:19 編集

    回答ありがとうございます!!
    教えてくださった方法でやって見たのですが
    open関数の戻り値をcharポインタにしてUnityのC#の方で出力して見たのですが”storage/emulated/0/Android/data/com.LogicLab_KJH/cache/220.wav” と出ました。そして音は全く鳴らなかったのが、Android機器の音量を最大にして聞いてみるとものすごくかすかに”シィー”という音がずっと流れています。解決策はありますでしょうか?

    キャンセル

  • 2018/11/17 19:20

    念のため、そのパスにwavファイルが実際にあるかどうか、ファイルマネージャー系のアプリで確認してみてください。
    あるのであれば、そのwavが他のアプリで正しく再生できるかどうか確認してください。
    正しければ、そのwavファイルの形式(特に符号なし整数や浮動小数点数といったデータの音声符号化方式)を変えてみてください。

    それでもうまくいかない場合は、私には分かりません。すいません。

    キャンセル

  • 2018/11/22 16:37

    ファイルを探し出しているように見えるのですが音が再生されませんでした。なのでサウンドの波形データを取り出して処理する形でうまく再生することが出来ました。勉強になりました。ありがとうございます^^

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.58%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る