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ế.
KẾT LUẬN 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á, Thạc 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 LIỆU THAM KHẢO TIẾNG VIỆT:
[1] Nguyễn Ngọc Bình Phương – Thái Thanh Phong, Các giải pháp lập trình C#
TIẾNG ANH:
[2] Michael Barr, O’Reilly andAssociates, Programming Embedded Systems in
C and C++, Website tham khảo: 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
PHỤC LỤC 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; }