Kết quả thực tế

Một phần của tài liệu Đồ án truyền âm thanh qua mạng 4g sd mã nguồn mở board nhúng raspberry (Trang 75 - 83)

4.3.4 .Thư viện TinyALSA

4.4. Kết quả thực tế

Sau khi hoàn thành hệ thống, em đã thu được kết quả như sau:

Hình 4.17: Hình ảnh bên phía server

Hình 4.18: Hình ảnh bên phía client

Kết luận chương

Qua chương 4 chúng ta đã xây dựng và viết phần mềm chương trình truyền âm thanh qua mạng và thử nhiệm với mơ hình thực tế.

KT LUN CHUNG

Sau một thời gian thực hiện đến nay đồ án của chúng em đã hoàn thành đúng thời gian quy định với yêu cầu đề tài đặt ra là “Nghiên cứu mã nguồn mở, board nhúng Raspberry Pi cho hệ thống phát âm thanh qua mạng 4G”.

Qua quá trình làm đồ án chúng em đã học được cách tra cứu tài liệu. Tìm hiểu về các đặc điểm của board nhúng Raspberry Pi, kiến thức về mạng Internet. Tìm hiểu được cấu trúc và lập trình truyền thơng qua mạng Internet.

Hướng phát triển của đề tài:

Ngày nay các hệ thống loa phường, loa thông báo bằng dây đang dần thể hiện sự bất cập vì việc đi dây phức tạp, truyền âm thanh qua mạng 4G đang có lợi thế lớn để thay thế cho các hệ thống cũ này.

Trong quá trình thực hiện đồ án, chúng em nhận được sự chỉ bảo tận tình của các thầy, cô giáo trong khoa và đặc biệt là thầy giáo Thiếu tá, Thc s Nguyễn Văn Xuân đã giúp em hoàn thành tốt đồ án tốt nghiệp của mình.

TÀI LIU THAM KHO TING VIT:

[1] Nguyễn Ngọc Bình Phương – Thái Thanh Phong, Các gii pháp lp trình C#

TING ANH:

[2] Michael Barr, O’Reilly andAssociates, Programming Embedded Systems in

C and C++, Website tham kho: https://github.com/tinyalsa/tinyalsa https://sites.google.com/site/embedded247/npcourse/lap-trinh-c-socket https://voer.edu.vn/m/bo-giao-thuc-rtprtcp/3d1c93bb https://tools.ietf.org/html/rfc3550 http://www.faqs.org/rfcs/rfc793.html https://www.ibm.com/support/knowledgecenter/en/SSLTBW_2.3.0/com.ibm.zos.v 2r3.bpxbd00/socket.htm

PHC LC 1. Code chương trình client

#include <stdio.h> #include <stdlib.h> #include <tinyalsa/pcm.h> #include <pthread.h> #include <unistd.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <netdb.h> #include <arpa/inet.h>

const int N = 160; // do dai du lieu truyen

const int M = 1000; // so khung du lieu cua bo dem unsigned char buffer[1000][400];

int pin=0, pout=0; char recvbuff[400]; char outbuff[400]; int sockfd;

const int SIGN_BIT = (0x80); const int QUANT_MASK = (0xf); const int NSEGS = (8);

const int SEG_SHIFT = (4); const int SEG_MASK = (0x70); const int BIAS = (0x84);

const int CLIP = 8159;

unsigned int MulawToLinear(unsigned int ulaw) {

ulaw = ~ulaw;

int t = ((ulaw & QUANT_MASK) << 3) + BIAS; t <<= (ulaw & SEG_MASK) >> SEG_SHIFT;

return ((ulaw & SIGN_BIT) > 0 ? (BIAS - t) : (t - BIAS)); }

void MuLawToLinear(unsigned char * bytes, int bitsPerSample, int channels)

{

int blockAlign = channels * bitsPerSample / 8; unsigned char *result;

result = outbuff;

for (int i = 0, counter = 0; i < N; i++, counter += blockAlign) {

unsigned int value = MulawToLinear(bytes[i]); unsigned char values0 =value % 256;

unsigned char values1 =value / 256; result[counter] = values0;

result[counter + 1] = values1; }

static int write_frames() {

unsigned int card = 0; unsigned int device = 0; int flags = PCM_OUT; int j,err;

const struct pcm_config config = { .channels = 1,

.format = PCM_FORMAT_S16_LE, .period_size = 1024, .period_count = 2, .start_threshold = 1024, .silence_threshold = 1024 * 2, .stop_threshold = 1024 * 2 };

struct pcm * pcm = pcm_open(card, device, flags, &config); if (pcm == NULL) {

fprintf(stderr, "failed to allocate memory for PCM\n"); return -1;

} else if (!pcm_is_ready(pcm)){ pcm_close(pcm);

fprintf(stderr, "failed to open PCM\n"); return -1; } while(1) { if (pout != pin) { MuLawToLinear(&buffer[pout][j],16,1); pout = pout +1; if (pout>=M) pout=0;

err = pcm_writei(pcm, outbuff, N); }

}

pcm_close(pcm); return 0;

void* phat_am(void* unused) { if (write_frames() < 0) { return(NULL); } return(NULL); } char incpin() {

int temp =pin; temp = temp +1; if (temp>=M) temp=0; if (temp!=pout) { pin =temp; return(1); } else return(0); } void send_rev(){ int i; i=read(sockfd,recvbuff,(N+16)); }

void* nhan_du_lieu(void* unused) { int i,j;

while(1) {

if (incpin()) { rev(); for(i=0;i<N;i++){ buffer[pin][i]=recvbuff[i+16]; } } } close(sockfd); return NULL; } void init_socket() { int portno=9000;

struct sockaddr_in serv_addr;

sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd < 0)

printf("ERROR opening socket");

memset(&serv_addr, '0', sizeof(serv_addr)); serv_addr.sin_family = AF_INET;

serv_addr.sin_port = htons(portno);

if(inet_pton(AF_INET, "118.71.4.45", &serv_addr.sin_addr)<=0){ printf("\n inet_pton error occured\n");

}

if(connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0){ printf("\n Error : Connect Failed \n");

} }

int main(void) {

pthread_t thread_id1, thread_id2; init_socket();

pthread_create(&thread_id1, NULL, &nhan_du_lieu, NULL); pthread_create(&thread_id2, NULL, &phat_am, NULL); while(1)

{ }

return EXIT_SUCCESS; }

Một phần của tài liệu Đồ án truyền âm thanh qua mạng 4g sd mã nguồn mở board nhúng raspberry (Trang 75 - 83)

Tải bản đầy đủ (PDF)

(83 trang)