Dmitrij D. Czarkoff said:
> There is one issue to note: by default tox clients are initialized to
> IPv6 and enable dual IPv4/6 sockets to support both address types.
> OpenBSD doesn't support such sockets, so if IPv6 address is not
> available, toxic should be started with "-4" switch, or it will never
> connect.

Apparently I forgot about another caveat: toxic uses OpenAL for sound,
and it currently lacks record support with sndio backend.

The attached patch adds sound recording capabilities to audio/openal:

========================================================================
  $PORTSDIR/audio/openal/patches/patch-Alc_backends_sndio_c
========================================================================
$OpenBSD$
--- Alc/backends/sndio.c.orig   Tue Dec 11 21:35:55 2012
+++ Alc/backends/sndio.c        Tue Apr  8 09:52:30 2014
@@ -44,9 +44,11 @@ typedef struct {
 
     ALvoid *mix_data;
     ALsizei data_size;
+    ALsizei frame_size;
 
     volatile int killNow;
     ALvoid *thread;
+    unsigned int mode;
 } sndio_data;
 
 
@@ -54,19 +56,16 @@ static ALuint sndio_proc(ALvoid *ptr)
 {
     ALCdevice *device = ptr;
     sndio_data *data = device->ExtraData;
-    ALsizei frameSize;
     size_t wrote;
 
     SetRTPriority();
 
-    frameSize = FrameSizeFromDevFmt(device->FmtChans, device->FmtType);
-
     while(!data->killNow && device->Connected)
     {
         ALsizei len = data->data_size;
         ALubyte *WritePtr = data->mix_data;
 
-        aluMixData(device, WritePtr, len/frameSize);
+        aluMixData(device, WritePtr, len/data->frame_size);
         while(len > 0 && !data->killNow)
         {
             wrote = sio_write(data->sndHandle, WritePtr, len);
@@ -88,20 +87,18 @@ static ALuint sndio_proc(ALvoid *ptr)
 }
 
 
-
-static ALCenum sndio_open_playback(ALCdevice *device, const ALCchar 
*deviceName)
+static ALCenum sndio_open(ALCdevice *device, const ALCchar *deviceName, 
unsigned int mode)
 {
     sndio_data *data;
 
-    if(!deviceName)
-        deviceName = sndio_device;
-    else if(strcmp(deviceName, sndio_device) != 0)
-        return ALC_INVALID_VALUE;
+    if(!deviceName || !strcmp(deviceName,sndio_device))
+        deviceName = SIO_DEVANY;
 
     data = calloc(1, sizeof(*data));
     data->killNow = 0;
+    data->mode = mode;
 
-    data->sndHandle = sio_open(NULL, SIO_PLAY, 0);
+    data->sndHandle = sio_open(deviceName, mode, 0);
     if(data->sndHandle == NULL)
     {
         free(data);
@@ -115,8 +112,19 @@ static ALCenum sndio_open_playback(ALCdevice *device, 
     return ALC_NO_ERROR;
 }
 
-static void sndio_close_playback(ALCdevice *device)
+static ALCenum sndio_open_playback(ALCdevice *device, const ALCchar 
*deviceName)
 {
+    return sndio_open(device, deviceName, SIO_PLAY);
+}
+
+static ALCenum sndio_open_capture(ALCdevice *device, const ALCchar *deviceName)
+{
+    return sndio_open(device, deviceName, SIO_REC);
+}
+
+
+static void sndio_close(ALCdevice *device)
+{
     sndio_data *data = device->ExtraData;
 
     sio_close(data->sndHandle);
@@ -124,16 +132,19 @@ static void sndio_close_playback(ALCdevice *device)
     device->ExtraData = NULL;
 }
 
-static ALCboolean sndio_reset_playback(ALCdevice *device)
+static ALCboolean sndio_reset(ALCdevice *device)
 {
     sndio_data *data = device->ExtraData;
     struct sio_par par;
+    unsigned int *chan;
 
     sio_initpar(&par);
 
     par.rate = device->Frequency;
-    par.pchan = ((device->FmtChans != DevFmtMono) ? 2 : 1);
 
+    chan = (data->mode == SIO_PLAY) ? &(par.pchan) : &(par.rchan);
+    *chan = ((device->FmtChans != DevFmtMono) ? 2 : 1);
+
     switch(device->FmtType)
     {
         case DevFmtByte:
@@ -181,7 +192,7 @@ static ALCboolean sndio_reset_playback(ALCdevice *devi
     }
 
     device->Frequency = par.rate;
-    device->FmtChans = ((par.pchan==1) ? DevFmtMono : DevFmtStereo);
+    device->FmtChans = ((*chan==1) ? DevFmtMono : DevFmtStereo);
 
     if(par.bits == 8 && par.sig == 1)
         device->FmtType = DevFmtByte;
@@ -209,19 +220,32 @@ static ALCboolean sndio_reset_playback(ALCdevice *devi
     return ALC_TRUE;
 }
 
-static ALCboolean sndio_start_playback(ALCdevice *device)
+static ALCboolean sndio_start(ALCdevice *device)
 {
     sndio_data *data = device->ExtraData;
 
+    sndio_reset(device);
+
     if(!sio_start(data->sndHandle))
     {
         ERR("Error starting playback\n");
         return ALC_FALSE;
     }
 
-    data->data_size = device->UpdateSize * 
FrameSizeFromDevFmt(device->FmtChans, device->FmtType);
+    data->frame_size = FrameSizeFromDevFmt(device->FmtChans, device->FmtType);
+    data->data_size = device->UpdateSize * data->frame_size;
     data->mix_data = calloc(1, data->data_size);
 
+    return ALC_TRUE;
+}
+
+static ALCboolean sndio_start_playback(ALCdevice *device)
+{
+    sndio_data *data = device->ExtraData;
+
+    if (sndio_start(device) == ALC_FALSE)
+        return ALC_FALSE;
+
     data->thread = StartThread(sndio_proc, device);
     if(data->thread == NULL)
     {
@@ -234,7 +258,7 @@ static ALCboolean sndio_start_playback(ALCdevice *devi
     return ALC_TRUE;
 }
 
-static void sndio_stop_playback(ALCdevice *device)
+static void sndio_stop(ALCdevice *device)
 {
     sndio_data *data = device->ExtraData;
 
@@ -254,18 +278,30 @@ static void sndio_stop_playback(ALCdevice *device)
 }
 
 
+static ALCenum sndio_capture_samples(ALCdevice *device, ALCvoid *buffer, 
ALCuint samples)
+{
+    sndio_data *data = device->ExtraData;
+    sio_read(data->sndHandle, buffer, samples * data->frame_size);
+    return ALC_NO_ERROR;
+}
+
+static ALCuint sndio_available_samples(ALCdevice *device)
+{
+    return device->UpdateSize;
+}
+
 static const BackendFuncs sndio_funcs = {
     sndio_open_playback,
-    sndio_close_playback,
-    sndio_reset_playback,
+    sndio_close,
+    sndio_reset,
     sndio_start_playback,
-    sndio_stop_playback,
-    NULL,
-    NULL,
-    NULL,
-    NULL,
-    NULL,
-    NULL,
+    sndio_stop,
+    sndio_open_capture,
+    sndio_close,
+    sndio_start,
+    sndio_stop,
+    sndio_capture_samples,
+    sndio_available_samples,
     ALCdevice_LockDefault,
     ALCdevice_UnlockDefault,
     ALCdevice_GetLatencyDefault
@@ -291,6 +327,7 @@ void alc_sndio_probe(enum DevProbe type)
             AppendAllDevicesList(sndio_device);
             break;
         case CAPTURE_DEVICE_PROBE:
+            AppendCaptureDeviceList(sndio_device);
             break;
     }
 }

-- 
Dmitrij D. Czarkoff

  • NEW: tox Dmitrij D. Czarkoff
    • Re: NEW: tox Dmitrij D. Czarkoff

Reply via email to