significado - structur c++
Obtención de iaxclient para enviar audio a/obtener audio de búfer en lugar de dispositivo de audio (1)
Por favor, eche un vistazo en iaxclient_lib.c también vea cómo funciona la lógica. Para enganchar o reemplazar la entrada / salida, puede cambiar la función iaxci_do_audio_callback en memcpy (e.ev.audio.data, data, size); donde se establece el búfer. También eche un vistazo a service_audio para comprender cómo puede reemplazar el búfer / flujo enviado a la ubicación remota (por ejemplo, want_send_audio y want_local_audio). También puede crear dispositivos virtuales de entrada / salida en el portaudio que, por el contrario, utilizan para procesar audio mediante buffers.
Para un ejemplo más concreto, mire el método principal en la fuente simplecall para obtener un buen comienzo. Sin embargo, el código fuente es demasiado largo para copiar y pegar, perdón por eso.
Estoy tratando de escribir un programa en C ++ (aunque Python hubiera estado bien también en caso de que alguien conozca una alternativa mejor (IAX / SIP)) que se conecte a un servidor Asterisk.
Después de la conexión, debe escuchar el audio y procesarlo. También debe enviar audio de vuelta. Estoy usando https://sourceforge.net/projects/iaxclient/ para eso (tenga en cuenta que hay varias versiones (betas, versiones regulares, versión svn) que se comportan de manera diferente).
Ahora bien, si entendí correctamente el código de la biblioteca, puede llamar a una función de devolución de llamada con un evento. Uno de esos eventos es IAXC_EVENT_AUDIO. En la estructura de ese IAXC_EVENT_AUDIO hay una dirección; entrante saliente. Y ahí es donde estoy perdido: con algunas versiones de iaxclient solo recibo los mensajes IAXC_SOURCE_REMOTE, con algunos ambos. Y si cambio al modo de prueba (que solo debería desactivar el dispositivo de audio) a menudo no recibo nada. Cuando recibo IAXC_SOURCE_LOCAL y IAXC_SOURCE_REMOTE, intenté establecer los buffers de esos eventos en datos aleatorios, pero eso no llega al otro extremo (lo establezco en modo RAW).
Como alguien alguna sugerencia, ¿cómo resolver esto?
Mi código de prueba es:
#include <iaxclient.h>
#include <unistd.h>
int iaxc_event_callback(iaxc_event e)
{
if (e.type == IAXC_EVENT_TEXT) {
printf("text/n");
}
else if (e.type == IAXC_EVENT_LEVELS) {
printf("level/n");
}
else if (e.type == IAXC_EVENT_STATE) {
struct iaxc_ev_call_state *st = iaxc_get_event_state(&e);
printf("/tcallno %d state %d format %d remote %s(%s)/n", st->callNo, st->state, st->format,st->remote, st->remote_name);
iaxc_key_radio(st->callNo);
}
else if (e.type == IAXC_EVENT_NETSTAT) {
printf("/tcallno %d rtt %d/n", e.ev.netstats.callNo, e.ev.netstats.rtt);
}
else if (e.type == IAXC_EVENT_AUDIO) {
printf("/t AUDIO!!!! %d %u %d/n", e.ev.audio.source, e.ev.audio.ts, e.ev.audio.size);
for(int i=0; i<e.ev.audio.size; i++)
printf("%02x ", e.ev.audio.data[i]);
printf("/n");
}
else {
printf("type: %d/n", e.type);
}
return 1;
}
int main(int argc, char *argv[])
{
iaxc_set_test_mode(1);
printf("init %d/n", iaxc_initialize(1));
iaxc_set_formats(IAXC_FORMAT_SPEEX, IAXC_FORMAT_SPEEX);
iaxc_set_event_callback(iaxc_event_callback);
printf("get audio pref %d/n", iaxc_get_audio_prefs());
//printf("set audio pref %d/n", iaxc_set_audio_prefs(IAXC_AUDIO_PREF_RECV_REMOTE_ENCODED));
printf("set audio pref %d/n", iaxc_set_audio_prefs(IAXC_AUDIO_PREF_RECV_REMOTE_RAW | IAXC_AUDIO_PREF_RECV_LOCAL_RAW));
printf("get audio pref %d/n", iaxc_get_audio_prefs());
printf("start thread %d/n", iaxc_start_processing_thread());
int id = -1;
printf("register %d/n", id = iaxc_register("6003", "1923", "192.168.64.1"));
int callNo = -1;
printf("call %d/n", callNo = iaxc_call("6003:[email protected]/6001"));
printf("unquelch: %d/n", iaxc_unquelch(callNo));
pause();
printf("finish/n");
printf("%d/n", iaxc_unregister(id));
printf("%d/n", iaxc_stop_processing_thread());
iaxc_shutdown();
return 0;
}