Skip to content

Commit 304ffb9

Browse files
committed
Implement OpenAL audio capture extension
1 parent f8229bf commit 304ffb9

File tree

4 files changed

+221
-0
lines changed

4 files changed

+221
-0
lines changed

project/src/media/openal/OpenALBindings.cpp

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,7 @@ namespace lime {
170170
}
171171
*/
172172

173+
173174
void lime_al_auxf (value aux, int param, float value) {
174175

175176
#ifdef LIME_OPENALSOFT
@@ -3512,6 +3513,101 @@ namespace lime {
35123513
}
35133514

35143515

3516+
value lime_alc_capture_open_device (HxString devicename, int frequency, int format, int buffersize) {
3517+
3518+
ALCdevice* alcDevice = alcCaptureOpenDevice (devicename.__s, frequency, format, buffersize);
3519+
3520+
value ptr = CFFIPointer (alcDevice, gc_alc_object);
3521+
alcObjects[alcDevice] = ptr;
3522+
return ptr;
3523+
3524+
}
3525+
3526+
3527+
HL_PRIM HL_CFFIPointer* HL_NAME(hl_alc_capture_open_device) (hl_vstring* devicename, int frequency, int format, int buffersize) {
3528+
3529+
ALCdevice* alcDevice = alcCaptureOpenDevice (devicename ? (char*)hl_to_utf8 ((const uchar*)devicename->bytes) : 0, frequency, format, buffersize);
3530+
3531+
HL_CFFIPointer* ptr = HLCFFIPointer (alcDevice, (hl_finalizer)hl_gc_alc_object);
3532+
alcObjects[alcDevice] = ptr;
3533+
return ptr;
3534+
3535+
}
3536+
3537+
3538+
bool lime_alc_capture_close_device (value device) {
3539+
3540+
al_gc_mutex.Lock ();
3541+
ALCdevice* alcDevice = (ALCdevice*)val_data (device);
3542+
alcObjects.erase (alcDevice);
3543+
al_gc_mutex.Unlock ();
3544+
3545+
return alcCaptureCloseDevice (alcDevice);
3546+
3547+
}
3548+
3549+
3550+
HL_PRIM bool HL_NAME(hl_alc_capture_close_device) (HL_CFFIPointer* device) {
3551+
3552+
al_gc_mutex.Lock ();
3553+
ALCdevice* alcDevice = (ALCdevice*)device->ptr;
3554+
alcObjects.erase (alcDevice);
3555+
al_gc_mutex.Unlock ();
3556+
3557+
return alcCaptureCloseDevice (alcDevice);
3558+
3559+
}
3560+
3561+
3562+
void lime_alc_capture_start (value device) {
3563+
3564+
ALCdevice* alcDevice = (ALCdevice*)val_data (device);
3565+
alcCaptureStart (alcDevice);
3566+
3567+
}
3568+
3569+
3570+
HL_PRIM void HL_NAME(hl_alc_capture_start) (HL_CFFIPointer* device) {
3571+
3572+
ALCdevice* alcDevice = (ALCdevice*)device->ptr;
3573+
alcCaptureStart (alcDevice);
3574+
3575+
}
3576+
3577+
3578+
void lime_alc_capture_stop (value device) {
3579+
3580+
ALCdevice* alcDevice = (ALCdevice*)val_data (device);
3581+
alcCaptureStop (alcDevice);
3582+
3583+
}
3584+
3585+
3586+
HL_PRIM void HL_NAME(hl_alc_capture_stop) (HL_CFFIPointer* device) {
3587+
3588+
ALCdevice* alcDevice = (ALCdevice*)device->ptr;
3589+
alcCaptureStop (alcDevice);
3590+
3591+
}
3592+
3593+
3594+
void lime_alc_capture_samples (value device, value buffer, int samples) {
3595+
3596+
ALCdevice* alcDevice = (ALCdevice*)val_data (device);
3597+
Bytes bytes (buffer);
3598+
alcCaptureSamples (alcDevice, bytes.b, samples);
3599+
3600+
}
3601+
3602+
3603+
HL_PRIM void HL_NAME(hl_alc_capture_samples) (HL_CFFIPointer* device, Bytes* buffer, int samples) {
3604+
3605+
ALCdevice* alcDevice = (ALCdevice*)device->ptr;
3606+
alcCaptureSamples (alcDevice, buffer->b, samples);
3607+
3608+
}
3609+
3610+
35153611

35163612

35173613
DEFINE_PRIME3v (lime_al_auxf);
@@ -3628,6 +3724,11 @@ namespace lime {
36283724
DEFINE_PRIME1v (lime_alc_process_context);
36293725
DEFINE_PRIME1v (lime_alc_resume_device);
36303726
DEFINE_PRIME1v (lime_alc_suspend_context);
3727+
DEFINE_PRIME4 (lime_alc_capture_open_device);
3728+
DEFINE_PRIME1 (lime_alc_capture_close_device);
3729+
DEFINE_PRIME1v (lime_alc_capture_start);
3730+
DEFINE_PRIME1v (lime_alc_capture_stop);
3731+
DEFINE_PRIME3v (lime_alc_capture_samples);
36313732

36323733

36333734
#define _TBYTES _OBJ (_I32 _BYTES)
@@ -3752,6 +3853,11 @@ namespace lime {
37523853
DEFINE_HL_PRIM (_VOID, hl_alc_process_context, _TCFFIPOINTER);
37533854
DEFINE_HL_PRIM (_VOID, hl_alc_resume_device, _TCFFIPOINTER);
37543855
DEFINE_HL_PRIM (_VOID, hl_alc_suspend_context, _TCFFIPOINTER);
3856+
DEFINE_HL_PRIM (_TCFFIPOINTER, hl_alc_capture_open_device, _STRING _I32 _I32 _I32);
3857+
DEFINE_HL_PRIM (_BOOL, hl_alc_capture_close_device, _TCFFIPOINTER);
3858+
DEFINE_HL_PRIM (_VOID, hl_alc_capture_start, _TCFFIPOINTER);
3859+
DEFINE_HL_PRIM (_VOID, hl_alc_capture_stop, _TCFFIPOINTER);
3860+
DEFINE_HL_PRIM (_VOID, hl_alc_capture_samples, _TCFFIPOINTER _TBYTES _I32);
37553861

37563862

37573863
}

src/lime/_internal/backend/native/NativeCFFI.hx

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1668,6 +1668,16 @@ class NativeCFFI
16681668

16691669
@:cffi private static function lime_alc_suspend_context(context:CFFIPointer):Void;
16701670

1671+
@:cffi private static function lime_alc_capture_open_device(devicename:String, frequency:Int, format:Int, buffersize:Int):CFFIPointer;
1672+
1673+
@:cffi private static function lime_alc_capture_close_device(device:CFFIPointer):Bool;
1674+
1675+
@:cffi private static function lime_alc_capture_start(device:CFFIPointer):Void;
1676+
1677+
@:cffi private static function lime_alc_capture_stop(device:CFFIPointer):Void;
1678+
1679+
@:cffi private static function lime_alc_capture_samples(device:CFFIPointer, buffer:Dynamic, samples:Int):Void;
1680+
16711681
@:cffi private static function lime_al_gen_filter():CFFIPointer;
16721682

16731683
@:cffi private static function lime_al_filteri(filter:CFFIPointer, param:Int, value:Dynamic):Void;
@@ -1835,6 +1845,16 @@ class NativeCFFI
18351845
private static var lime_alc_resume_device = new cpp.Callable<cpp.Object->cpp.Void>(cpp.Prime._loadPrime("lime", "lime_alc_resume_device", "ov", false));
18361846
private static var lime_alc_suspend_context = new cpp.Callable<cpp.Object->cpp.Void>(cpp.Prime._loadPrime("lime", "lime_alc_suspend_context", "ov",
18371847
false));
1848+
private static var lime_alc_capture_open_device = new cpp.Callable<String->Int->Int->Int->cpp.Object>(cpp.Prime._loadPrime("lime", "lime_alc_capture_open_device",
1849+
"siiio", false));
1850+
private static var lime_alc_capture_close_device = new cpp.Callable<cpp.Object->Bool>(cpp.Prime._loadPrime("lime", "lime_alc_capture_close_device", "ob",
1851+
false));
1852+
private static var lime_alc_capture_start = new cpp.Callable<cpp.Object->cpp.Void>(cpp.Prime._loadPrime("lime", "lime_alc_capture_start", "ov",
1853+
false));
1854+
private static var lime_alc_capture_stop = new cpp.Callable<cpp.Object->cpp.Void>(cpp.Prime._loadPrime("lime", "lime_alc_capture_stop", "ov",
1855+
false));
1856+
private static var lime_alc_capture_samples = new cpp.Callable<cpp.Object->cpp.Object->Int->cpp.Void>(cpp.Prime._loadPrime("lime", "lime_alc_capture_samples",
1857+
"ooiv", false));
18381858
private static var lime_al_gen_filter = new cpp.Callable<Void->cpp.Object>(cpp.Prime._loadPrime("lime", "lime_al_gen_filter", "o", false));
18391859
private static var lime_al_filteri = new cpp.Callable<cpp.Object->Int->cpp.Object->cpp.Void>(cpp.Prime._loadPrime("lime", "lime_al_filteri", "oiov",
18401860
false));
@@ -1955,6 +1975,11 @@ class NativeCFFI
19551975
private static var lime_alc_process_context = CFFI.load("lime", "lime_alc_process_context", 1);
19561976
private static var lime_alc_resume_device = CFFI.load("lime", "lime_alc_resume_device", 1);
19571977
private static var lime_alc_suspend_context = CFFI.load("lime", "lime_alc_suspend_context", 1);
1978+
private static var lime_alc_capture_open_device = CFFI.load("lime", "lime_alc_capture_open_device", 4);
1979+
private static var lime_alc_capture_close_device = CFFI.load("lime", "lime_alc_capture_close_device", 1);
1980+
private static var lime_alc_capture_start = CFFI.load("lime", "lime_alc_capture_start", 1);
1981+
private static var lime_alc_capture_stop = CFFI.load("lime", "lime_alc_capture_stop", 1);
1982+
private static var lime_alc_capture_samples = CFFI.load("lime", "lime_alc_capture_samples", 3);
19581983
private static var lime_al_gen_filter = CFFI.load("lime", "lime_al_gen_filter", 0);
19591984
private static var lime_al_filteri = CFFI.load("lime", "lime_al_filteri", 3);
19601985
private static var lime_al_filterf = CFFI.load("lime", "lime_al_filterf", 3);
@@ -2311,6 +2336,22 @@ class NativeCFFI
23112336

23122337
@:hlNative("lime", "hl_alc_suspend_context") private static function lime_alc_suspend_context(context:ALContext):Void {}
23132338

2339+
@:hlNative("lime", "hl_alc_capture_open_device") private static function lime_alc_capture_open_device(devicename:String, frequency:Int, format:Int, buffersize:Int):CFFIPointer
2340+
{
2341+
return null;
2342+
}
2343+
2344+
@:hlNative("lime", "hl_alc_capture_close_device") private static function lime_alc_capture_close_device(device:ALDevice):Bool
2345+
{
2346+
return false;
2347+
}
2348+
2349+
@:hlNative("lime", "hl_alc_capture_start") private static function lime_alc_capture_start(device:ALDevice):Void {}
2350+
2351+
@:hlNative("lime", "hl_alc_capture_stop") private static function lime_alc_capture_stop(device:ALDevice):Void {}
2352+
2353+
@:hlNative("lime", "hl_alc_capture_samples") private static function lime_alc_capture_samples(device:ALDevice, buffer:Bytes, samples:Int):Void {}
2354+
23142355
@:hlNative("lime", "hl_al_gen_filter") private static function lime_al_gen_filter():CFFIPointer
23152356
{
23162357
return null;

src/lime/media/OpenALAudioContext.hx

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package lime.media;
22

3+
import haxe.io.Bytes;
34
#if (!lime_doc_gen || lime_openal)
45
import lime.media.openal.AL;
56
import lime.media.openal.ALBuffer;
@@ -587,5 +588,30 @@ class OpenALAudioContext
587588
{
588589
ALC.suspendContext(context);
589590
}
591+
592+
public function captureOpenDevice(deviceName:String, frequency:Int, format:Int, bufferSize:Int):ALDevice
593+
{
594+
return ALC.captureOpenDevice(deviceName, frequency, format, bufferSize);
595+
}
596+
597+
public function captureCloseDevice(device:ALDevice):Bool
598+
{
599+
return ALC.captureCloseDevice(device);
600+
}
601+
602+
public function captureStart(device:ALDevice):Void
603+
{
604+
ALC.captureStart(device);
605+
}
606+
607+
public function captureStop(device:ALDevice):Void
608+
{
609+
ALC.captureStop(device);
610+
}
611+
612+
public function captureSamples(device:ALDevice, buffer:Bytes, samples:Int):Void
613+
{
614+
ALC.captureSamples(device, buffer, samples);
615+
}
590616
}
591617
#end

src/lime/media/openal/ALC.hx

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ package lime.media.openal;
44
import lime._internal.backend.native.NativeCFFI;
55
import lime.system.CFFI;
66
import lime.system.CFFIPointer;
7+
import haxe.io.Bytes;
78

89
#if !lime_debug
910
@:fileXml('tags="haxe,release"')
@@ -33,6 +34,9 @@ class ALC
3334
public static inline var ENUMERATE_ALL_EXT:Int = 1;
3435
public static inline var DEFAULT_ALL_DEVICES_SPECIFIER:Int = 0x1012;
3536
public static inline var ALL_DEVICES_SPECIFIER:Int = 0x1013;
37+
public static inline var CAPTURE_DEVICE_SPECIFIER:Int = 0x310;
38+
public static inline var CAPTURE_DEFAULT_DEVICE_SPECIFIER:Int = 0x311;
39+
public static inline var CAPTURE_SAMPLES:Int = 0x312;
3640

3741
public static function closeDevice(device:ALDevice):Bool
3842
{
@@ -202,5 +206,49 @@ class ALC
202206
NativeCFFI.lime_alc_suspend_context(context);
203207
#end
204208
}
209+
210+
public static function captureOpenDevice(deviceName:String, frequency:Int, format:Int, bufferSize:Int):ALDevice
211+
{
212+
#if (lime_cffi && lime_openal && !macro)
213+
var handle = NativeCFFI.lime_alc_capture_open_device(deviceName, frequency, format, bufferSize);
214+
215+
if (handle != null)
216+
{
217+
return new ALDevice(handle);
218+
}
219+
#end
220+
221+
return null;
222+
}
223+
224+
public static function captureCloseDevice(device:ALDevice):Bool
225+
{
226+
#if (lime_cffi && lime_openal && !macro)
227+
return NativeCFFI.lime_alc_capture_close_device(device);
228+
#end
229+
230+
return false;
231+
}
232+
233+
public static function captureStart(device:ALDevice):Void
234+
{
235+
#if (lime_cffi && lime_openal && !macro)
236+
NativeCFFI.lime_alc_capture_start(device);
237+
#end
238+
}
239+
240+
public static function captureStop(device:ALDevice):Void
241+
{
242+
#if (lime_cffi && lime_openal && !macro)
243+
NativeCFFI.lime_alc_capture_stop(device);
244+
#end
245+
}
246+
247+
public static function captureSamples(device:ALDevice, buffer:Bytes, samples:Int):Void
248+
{
249+
#if (lime_cffi && lime_openal && !macro)
250+
NativeCFFI.lime_alc_capture_samples(device, buffer, samples);
251+
#end
252+
}
205253
}
206254
#end

0 commit comments

Comments
 (0)