Is this easiest way to make DLL for PortAudio ASIO on Windows using VisualC++ Express ?
1.
1.PortAudio Windows ASIO with MSVC での、DLLの作り方 失敗作
DLLを作るのは、生まれて初めてなのですが、なんとかできました。
失敗が、続きました。
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)