Using Audiere in VB.NET

lkd
11-30-2005, 01:44 PM
Hi, I posted this same message on the Xtreme .NET Interop board also but figure it would be good to post here too. I'm running into a problem when trying to use class interfaces from the sound library Audiere. The library was written in C++ as virtual functions that were COM compatible. To use the interface you call a function in the DLL that returns a pointer to the interface (Factory?). There are bindings for Purebasic and Delphi that use the interfaces directly. I made a binding for the D language using interfaces that inherited from the IUnknown interface and it worked. Since .NET supports COM interop I thought this should work easily. I created the interfaces and marshaled them as IUnknown(I had to inherit from IUnknown to get it to work in D). I declared the functions in the DLL and had it return the interface. I tried to run it but it gives me a fatal error code. I tried to marshal the return type as UnmanagedType.IUnknown and UnmanagedType.Interface but it still fails. Any ideas?


VB Audiere Header
-----------------
'audiere.vb

Imports System.Runtime.InteropServices

Module Audiere

' <ComVisible(True), ComImport()> _
Interface RefCounted
Sub ref() ' int
Sub unref() ' int
End Interface

' <InterfaceType(ComInterfaceType.InterfaceIsIUnknown)> _
Interface File : Inherits RefCounted
Function read(ByVal pbuffer As Integer, ByVal size As Integer) As Integer ' int
Function seek(ByVal position As Integer, ByVal SeekMode As Integer) As Boolean ' bool
Function tell() As Integer ' int
End Interface

' <InterfaceType(ComInterfaceType.InterfaceIsIUnknown)> _
Interface SampleBuffer : Inherits RefCounted
Sub getFormat(ByVal channel_count As Integer, ByVal sample_rate As Integer, ByVal lsample_format As Integer) ' Sub
Function getLength() As Integer ' int
Function getSamples() As Integer ' int
Function openStream() As SampleSource ' pSampleSource
End Interface

' <InterfaceType(ComInterfaceType.InterfaceIsIUnknown)> _
Interface SampleSource : Inherits RefCounted
Sub getFormat(ByVal v As Integer, ByVal v2 As Integer) ' Sub
Function Read(ByVal v As Integer, ByVal v2 As Integer) As Integer ' int
Sub reset() ' Sub
Function isSeekable() As Boolean ' bool
Function getLength() As Integer ' int
Sub setPosition(ByVal v As Integer) ' Sub
Function getPosition() As Integer ' int
Function getRepeat() As Boolean ' bool
Sub setRepeat(ByVal v As Integer) ' Sub
End Interface

' <InterfaceType(ComInterfaceType.InterfaceIsIUnknown)> _
Interface LoopPointSource : Inherits SampleSource
Sub addLoopPoint(ByVal location As Integer, ByVal target As Integer, ByVal loopCount As Integer) ' Sub
Sub removeLoopPoint(ByVal index As Integer) ' Sub
Function getLoopPointCount() As Integer ' int
Function getLoopPoint(ByVal index As Integer, ByVal plocation As Integer, ByVal ptarget As Integer, ByVal ploopCount As Integer) As Boolean ' bool
End Interface

' <InterfaceType(ComInterfaceType.InterfaceIsIUnknown)> _
Interface OutputStream : Inherits RefCounted
Function play() As Boolean
Function _stop() As Boolean ' bool
Function isPlaying() As Boolean ' bool
Sub reset() ' Sub
Sub setRepeat(ByVal v As Boolean) ' Sub
Function getRepeat() As Boolean ' bool
Sub setVolume(ByVal v As Single) ' Sub
Function getVolume() As Single ' float
Sub setPan(ByVal v As Single) ' Sub
Function getPan() As Single ' float
Sub setPitchShift(ByVal v As Single) ' Sub
Function getPitchShift() As Single ' float
Function isSeekable() As Boolean ' bool
Function getLength() As Integer ' int
Sub setPosition(ByVal v As Integer) ' Sub
Function getPosition() As Integer ' int
End Interface

'<InterfaceType(ComInterfaceType.InterfaceIsIUnknown)> _
Interface AudioDevice : Inherits RefCounted
Sub update() ' Sub
Function openStream(ByVal pSampleSource As SampleSource) As OutputStream 'OutputStream ' pAudOutputStream
Function openBuffer(ByRef pSamples As IntPtr, ByVal frame_count As Integer, ByVal channel_count As Integer, ByVal sample_rate As Integer, ByVal sample_format As Integer) As OutputStream ' pAudOutputStream
Function getName() As String ' char.l
End Interface

<InterfaceType(ComInterfaceType.InterfaceIsIUnknown)> _
Interface SoundEffect : Inherits RefCounted
Sub play() ' Sub
Sub _stop() ' Sub
Sub setVolume(ByVal volume As Single) ' Sub
Function getVolume() As Single ' float
Sub setPan(ByVal pan As Single) ' Sub
Function getPan() As Single ' float
Sub setPitchShift(ByVal shift As Single) ' Sub
Function getPitchShift() As Single ' float
End Interface


Enum SampleFormat
SF_U8 ' unsigned 8-bit integer [0,255]
SF_S16 ' signed 16-bit integer in host end Interface ianness [-32768,32767]
End Enum

Enum FileFormat
FF_AUTODETECT
FF_WAV
FF_OGG
FF_FLAC
FF_MP3
FF_MOD
FF_AIFF
End Enum

Enum SoundEffectType

SE_SINGLE
SE_MULTIPLE
End Enum

Enum SeekMode

SM_Begin
SM_Current
SM_end
End Enum

'Functions
'char* AdrGetVersion()

'char* AdrGetSupportedFileFormats()

'char* AdrGetSupportedAudioDevices()
Declare Function GetSupportedAudioDevices Lib "audiere" Alias "_AdrGetSupportedAudioDevices@0" () As String
'int AdrGetSampleSize(SampleFormat format)

'AudioDevice AdrOpenDevice(char* name = null, char* parameters = null)
Declare Function OpenDevice Lib "audiere" Alias "_AdrOpenDevice@8" (Optional ByVal name As String = Nothing, Optional ByVal parameters As String = Nothing) As AudioDevice

'SampleSource AdrOpenSampleSource(char* filename, FileFormat file_format)

'SampleSource AdrOpenSampleSourceFromFile(File file, FileFormat file_format)

'SampleSource AdrCreateTone(double frequency)

'SampleSource AdrCreateSquareWave(double frequency)

'SampleSource AdrCreateWhiteNoise()

'SampleSource AdrCreatePinkNoise()

'LoopPointSource AdrCreateLoopPointSource(SampleSource source)

'OutputStream AdrOpenSound(AudioDevice device, SampleSource source, bool streaming)

'SampleBuffer AdrCreateSampleBuffer(Sub* samples, int frame_count, int channel_count, int sample_rate, SampleFormat sample_format)

'SampleBuffer AdrCreateSampleBufferFromSource(SampleSource source)

'SoundEffect AdrOpenSoundEffect(AudioDevice device, SampleSource source, SoundEffectType type)

'File AdrOpenFile(char* name, bool writeable)

'File AdrCreateMemoryFile(Sub* buffer, int size)
End Module

--------------------

VB Test Code
--------------------
'main.vb

Module Main

Sub Main()
Dim dev As AudioDevice = OpenDevice() 'fatal error when initializing interface
'dev.getName()
Inkey()

End Sub

End Module

EZ Archive Ads Plugin for vBulletin Copyright 2006 Computer Help Forum