GSM: Add audio frame type for uncompressed 16 bit frame
[lcr.git] / gsm.cpp
diff --git a/gsm.cpp b/gsm.cpp
index ec33695..b9b88ee 100644 (file)
--- a/gsm.cpp
+++ b/gsm.cpp
@@ -290,6 +290,15 @@ void Pgsm::frame_receive(void *arg)
                return;
 
        switch (frame->msg_type) {
+       case ANALOG_8000HZ:
+               if (p_g_media_type != MEDIA_TYPE_ANALOG) {
+                       PERROR("'Analog' frame, but current media type mismatches.\n");
+                       return;
+               }
+               for (i = 0; i < 160; i++) {
+                       data[i] = audio_s16_to_law[((int16_t *)frame->data)[i] & 0xffff];
+               }
+               break;
        case GSM_TCHF_FRAME:
                if (p_g_media_type != MEDIA_TYPE_GSM) {
                        PERROR("FR frame, but current media type mismatches.\n");
@@ -450,6 +459,9 @@ int Pgsm::audio_send(unsigned char *data, int len)
                p_g_rxpos = 0;
 
                switch (p_g_media_type) {
+               case MEDIA_TYPE_ANALOG:
+                       frame_send(p_g_rxdata, 320, ANALOG_8000HZ);
+                       break;
                case MEDIA_TYPE_GSM:
                        if (!p_g_fr_encoder) {
                                PERROR("FR frame, but encoder not created.\n");
@@ -1254,6 +1266,9 @@ static int mncc_send(struct lcr_gsm *lcr_gsm, int msg_type, void *data)
 
        /* FIXME: the caller should provide this */
        switch (msg_type) {
+       case ANALOG_8000HZ:
+               len = sizeof(struct gsm_data_frame) + 320;
+               break;
        case GSM_TCHF_FRAME:
                len = sizeof(struct gsm_data_frame) + 33;
                break;
@@ -1280,11 +1295,11 @@ static int mncc_fd_close(struct lcr_gsm *lcr_gsm, struct lcr_fd *lfd)
        /* free all the calls that were running through the MNCC interface */
        port = port_first;
        while(port) {
-               if ((port->p_type & PORT_CLASS_mISDN_MASK) == PORT_CLASS_GSM) {
+               if ((port->p_type & PORT_CLASS_MASK) == PORT_CLASS_GSM) {
                        pgsm = (class Pgsm *)port;
                        if (pgsm->p_g_lcr_gsm == lcr_gsm) {
                                message = message_create(pgsm->p_serial, ACTIVE_EPOINT(pgsm->p_epointlist), PORT_TO_EPOINT, MESSAGE_RELEASE);
-                               message->param.disconnectinfo.cause = 27; // temp. unavail.
+                               message->param.disconnectinfo.cause = 41; // temp. fail.
                                message->param.disconnectinfo.location = LOCATION_PRIVATE_LOCAL;
                                message_put(message);
                                pgsm->new_state(PORT_STATE_RELEASE);