отправка необработанных данных на звуковую карту с кодом в Ubuntu - PullRequest
0 голосов
/ 04 января 2019

Я пытаюсь записать необработанные данные, которые я получаю извне из последовательного порта на устройство звуковой карты, используя код c в Ubuntu, чтобы воспроизвести его.

Я искал решение повсюду и обнаружил, что оно может быть реализовано с помощью API ALSA, но не смог найти четкого примера того, как мне это сделать. Я также пытался использовать функцию ioctl (), но она не воспроизводится.

#include <stdio.h>
#include <fcntl.h>  // File Control Definitions 
#include <string.h>
#include <pthread.h>
#include <semaphore.h> 
#include <stdlib.h>
#include <termios.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <linux/kd.h>
int flg = 0, rdlen = 0;
int com_ptr, sound_ptr;
char input_data[16];
char output_data[16];
sem_t data_mutex; 


void* read_data(void *arg)
{
    int i, j;

    for (j = 0 ; j < 5 ; j++)
    {
        while(flg == 1);//waits for the data to be read
        sem_wait(&data_mutex);
        printf("\ndata_read_mutex MUTEX TAKEN\n");
        printf("read\n");

        rdlen = read(com_ptr, input_data, sizeof(input_data));
        //fwrite(buf, 1, rdlen, log_file);
        printf("input length : %d\n",rdlen);

        for(i = 0 ; i < rdlen - 1; i++)
        {
            //input_data[i] = data[i];
            printf("Reading.... : %c\n", input_data[i]);
        }//for

        if(sem_post(&data_mutex))
        {
            printf("ERROR POSTING data_mutex\n");
        }//if
        else
        {
            flg = 1;
            printf("data_mutex WAS POSTED\n");
        }
    }//for
}//read_data

void* play_data(void *arg)
{
    int i, j;

    for (j = 0 ; j < 5 ; j++)
    {
        while (flg == 0);// waits for the data to be redy
        sem_wait(&data_mutex);
        printf("\ndata_ready_mutex MUTEX TAKEN\n");
        printf("play\n");

        for(i = 0 ; i < rdlen - 1; i++)
        {
            output_data[i] = input_data[i];
            printf("Playing.... : %c\n", output_data[i]);
            //rdlen = write(sound_ptr, input_data, sizeof(input_data));
            //ioctl(sound_ptr, KIOCSOUND, 119);
            //usleep(500000);
            //sound(output_data[i] - 48);
        }//for

        if(sem_post(&data_mutex))
        {
            printf("ERROR POSTING data_mutex\n");
        }//if
        else
        {
            flg = 0;
            printf("data_mutex WAS POSTED\n");
        }
    }//for
}//play_data

int main(int argc, char **argv)
{
    int i;

    sem_init(&data_mutex, 0, 1); 

    void * read_return, *play_return;
    pthread_t play_t, read_t;



    if (argc == 3)
    {
        printf( "input address = %s\n", argv[1]);
        printf( "output address = %s\n", argv[2]);
    }


    com_ptr = open("/dev/stdin", O_RDWR | O_NOCTTY);
    sound_ptr = open("/proc/asound/card0", 'w');
    if(com_ptr == -1)
        printf("\nError! in Opening ttyUSB0  ");
    else
        printf("\nttyUSB0 Opened Successfully ");


    if (pthread_create(&read_t, NULL, &read_data, NULL))
    {
        perror("read pthread_create() error");
        exit(1);
    }//if

    sleep(1); // ensuring the read gets the first round

    if (pthread_create(&play_t, NULL, &play_data, NULL))
    {
        perror("play pthread_create() error");
        exit(1);
    }//if

    if (pthread_join(read_t, &read_return))
    {
        perror("read pthread_join() error");
        exit(1);
    }//if
    if (pthread_join(play_t, &play_return))
    {
        perror("play pthread_join() error");
        exit(1);
    }//if

    sem_destroy(&data_mutex); 

    return 0;
}//main

Я получаю данные и могу их прочитать, но мне нужно записать их на звуковую карту, чего я не могу сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...