Is this easiest way to make DLL for PortAudio ASIO on Windows using VisualC++ Express ?

1. 

1.PortAudio Windows ASIO with MSVC での、DLLの作り方 失敗作

      DLLを作るのは、生まれて初めてなのですが、なんとかできました。

Visual C++ チュートリアル : ダイナミック リンク ライブラリ (DLL: Dynamic Link Library) の作成と使用  で、教えて頂きました。

失敗が、続きました。

download した、 PortAudioは、

です。

最新版で、しょうね。(今日は 061125 や、さかい。 ラッキー !  )

まず、最初に、必要なファイルを、Portaudio Windows ASIO with MSVC

に、従って、揃えておきます。

 以下は、失敗例です。

動きますが、欠点が、あります。

 ( 尚 このページの最後の方に、この欠点を除いたものを、掲載してあります。)

VisualC++ .NET Express Edition にて

新しい、空の dllプロジェクトを作ります。 (私は、プロジェクト名を "PA19_ASIO" と、命名しました)

まず、PA19_ASIO.h という ヘッダーファイルを新規作成し、以下のように記述します。

それから、portaudioのcommonフォルダ内にある、front.cをプロジェクト内に、コピーして、PA19_ASIO.cppと、命名しておきます。

必ず、エラーが出ます。

それでは、先ほどの、チュートリアルにあるように、クラス化すれば、どうなるでしょうか?

何と! 成功します。 警告は、一杯でますが、成功します。

尚、 front.c内の、export対象の関数には、"PA19_ASIO::"の前置きが必要です。

 

    例    int   PA19_ASIO:: PaGetVersion(void) {

 

これに、味をしめて、 テストプログラムpatest_saw.cを、動かすのに必要な関数を、並べてみました。

これも、成功します。

ただ、Pa_CloseStream(PaStream* stream)関数は、どうしても、失敗します。

そこで、一計。

myPa_CloseStream(PaStream* stream)関数を、作るのです。

Pa_CloseStream(PaStream* stream)を、呼び出すだけの関数です。

この、myPa_CloseStream(PaStream* stream)関数のexportは、成功します。

これで、PA19_ASIO クラスのdllファイル、及び libファイル、hファイルを、作る事が、できました。

しかし、これを利用するプログラムでは、

    クラス名を前置きしないと、動作しませんね。

patest_saw.cプログラムに、修正を加えなくては、なりません。

関数の前に、いちいち、"PA_ASIO::" と、書かなくては、ならないし、

paCloseStream(Stream* stream);関数は

mypaCloseStream(Stream* stream);と、書き換えなくては、動作しないのです。

これで、プログラムは、動作し、テストプログラムのsaw波は、「ビーン」と、産声を挙げました、ヤッター!

これは、これで、嬉しかったのですが、

   1.  "PA_ASIO::"の、前置きが必要。

    2. 元のtestプログラムに、手を入れなければならない。

これが、不満でした。

この不満を解消する手が、ありました....なんと。

2. 正しいDLLの作り方か、どうか? 解りませぬが....

以下の方法で、解決しました。

作戦

//*******************************************************************************************************

   

    VisualC++の警告で、「再定義されています」と、あるのですから、プロジェクト全体の中で

    定義されている所を、探します。 --> "portaudio.h " 内にだけ、prototype宣言がありました。

    従って、"portaudio.h "内で、export宣言してやれば、再定義が、解消されるはずです。

//*******************************************************************************************************

この作戦は、見事、図に当たりました。

この方法は、portaudio.h (必要ならば、他のhファイルも) を、書き換えてしまいますので、 

portaudioフォルダ全体を、どこかに、保存して、コピーを使いましょう。

先ほど、PA19_ASIO.h内に、書いていて事を、portaudio.h 内に、書いてしまうのです。

front.cに、我々が使う関数の大半が、書いてあります。

front.cに     "#define    _MY_MAKE_DLL_"を、書くことを、お忘れなさいませんように。    

これで、buildは、成功します。

これで、

    テストプログラムを、書き換える事なく、動作する事ができました、 \(^_^)

尚、後ほど、他にもexportしなければならない関数が、存在する事に、気付きました。

これらの関数は、front.c 以外に、置かれていますので、

    portaudio.hに、行った変更と、同じ事を、そのhファイルに書きます。

    そのcppファイルには、" #define _MY_MAKE_DLL_" と、書くことが、必要です。

もし、hファイルを持たないcppファイル内の関数を、exportしなければならない時は

    portaudio.hファイル内に、export宣言を、書いたならば、如何でしょうか?

    例     __PORT     need_export_func(Stream* stream);  等。

3.  PortAudio ASIO DLLの使い方

3つのファイルが、必要です。

releaseフォルダ内にできた 2つのファイルが必要です。例えば

"PA19_ASIO2.dll"    "PA19_ASIO2.lib"

それから、改変したヘッダーファイル "portaudio.h"

1. 空の、新しいWin32 Console Application プロジェクトを作ります。

2. そのプロジェクト内に、"PA19_ASIO2.dll"    "PA19_ASIO.lib"     "portaudio.h" を、コピーしておきます。

3. \portaudio\test\patest_***.c を プロジェクトに追加。

4. コピーした  "portaudio.h"への パスを設定(プロジェクトのプロパティを開く -> c/c++ -> 全般 -> 追加のインクルードディレクトリ)

5. libファイルを指定する(プロパティ -> リンカ -> 入力 -> 追加の依存ファイルに、***.libを、置く。

これで、buildします。

エラーが出ましたら、それを、潰して行きます。

完成したら、run しましょう。 

うまく行けば バンザーイ!

******************************************************************************************

以上のように、modifyする事を、PortAudioは、禁止していません。

素晴らしい趣旨だと、思います、 PortAudioの製作者の方々、すばらしいものを、ありがとうございます。

以下の内容を、全部理解できた訳では、ないのですが、その趣旨を、掲げておきます。

* Portable Audio I/O Library Multi-Host API front end

* Validate function parameters and manage multiple host APIs.

*

* Based on the Open Source API proposed by Ross Bencina

* Copyright (c) 1999-2002 Ross Bencina, Phil Burk

*

* Permission is hereby granted, free of charge, to any person obtaining

* a copy of this software and associated documentation files

* (the "Software"), to deal in the Software without restriction,

* including without limitation the rights to use, copy, modify, merge,

* publish, distribute, sublicense, and/or sell copies of the Software,

* and to permit persons to whom the Software is furnished to do so,

* subject to the following conditions:

*

* The above copyright notice and this permission notice shall be

* included in all copies or substantial portions of the Software.

*

* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,

* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF

* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.

* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR

* ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF

* CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION

* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

*/

そうそう、

肝心の、Callback関数が、理解できていないんでした、なはは (^_^;;

H.18.11.25 (20061125)