Just to get things started.  The USRP channel driver is a very useful tool for getting PCM audio in/our of allstar in a pure digital format.  We used this to transfer decoded AMBE from DMR to Allstar with this snipit of code:

    #define USRP_PCM_SAMPLES 160

    #define USRP_VOICE_FRAME_SIZE (USRP_PCM_SAMPLES*sizeof(short))  // 0.02 * 8k

    #define USRP_ENDPOINT   "192.168.1.180"

    #define USRP_PORT       32001

    

    enum { USRP_TYPE_VOICE=0, USRP_TYPE_DTMF, USRP_TYPE_TEXT };

    

    // udp data header

    struct _chan_usrp_bufhdr {

        char eye[4]; // verification string

        uint32_t seq; // sequence counter

        uint32_t memory; // memory ID or zero (default)

        uint32_t keyup; // tracks PTT state

        uint32_t talkgroup; // trunk TG id

        uint32_t type; // see above enum

        uint32_t mpxid; // for future use

        uint32_t reserved; // for future use

        short audio[USRP_PCM_SAMPLES];

    };

    static DV3000_UDP *udp2 = NULL;

    static int seq = 0;

   

    void sendAudioToUSRP( void *buffer, int bytes )

    {

        struct _chan_usrp_bufhdr    packet;

        unsigned char *recvBuffer = (unsigned char *)&packet;

        int packetSize = sizeof( struct _chan_usrp_bufhdr );


        memset(recvBuffer, 0, packetSize);

        

        if (udp2 == NULL)

        {

            char address[] = USRP_ENDPOINT;

            udp2 = new DV3000_UDP();

            udp2->openSocket(address, USRP_PORT);

            if (packetSize != ((USRP_PCM_SAMPLES * sizeof(short)) + (8 * sizeof(uint32_t))))

                printf("Alignment error");

        }


        memcpy(packet.eye, "USRP", 4);

        packet.keyup = 1;

        packet.seq = htonl(seq++);

        packet.type = USRP_TYPE_VOICE;


        memcpy(packet.audio, buffer, bytes);

        udp2->writeSocket(recvBuffer,  packetSize);

    }