2016-11-07 81 views
1

在Ubuntu Linux上,我編寫了一個基於Libao示例程序的c程序來打開音頻文件和播放。它工作正常,但在結束後播放的結尾是高亢的高音噪音。這裏是我修改mt libao示例的代碼。我該如何解決它?請幫助C程序結束後在Linux crackels中播放音頻文件

#include <stdio.h> 
#include <string.h> 
#include <ao/ao.h> 
#include <math.h> 
#define BUF_SIZE 4096 

int main(int argc, char **argv) 
{ 
ao_device *device; 
ao_sample_format format; 
int default_driver; 
char *buffer; 
int buf_size; 
int sample; 
FILE *fp; 

float freq = 440.0; 
int i; 
/* -- Initialize -- */ 
fprintf(stderr, "libao example program\n"); 
ao_initialize(); 
/* -- Setup for default driver -- */ 
default_driver = ao_default_driver_id(); 
memset(&format, 0, sizeof(format)); 
format.bits = 16; 
format.channels = 2; 
format.rate = 44100; 
format.byte_format = AO_FMT_LITTLE; 
/* -- Open driver -- */ 
// device = ao_open_live(default_driver, &format, NULL /* no options */); 
device = ao_open_live(default_driver, &format, NULL /* no options */); 

if (device == NULL) { 
    fprintf(stderr, "Error opening device.\n"); 
    return 1; 
} 


fp = fopen("nc.wav", "rb"); 
if (fp == NULL) { 
fprintf(stderr, "Unable to open file \n"); 
    return; 
    } 

fseek(fp, 0, SEEK_END); 
unsigned long fileLen = ftell(fp); 
fseek(fp, 0, SEEK_SET); 

//Allocate memory 
buffer=(char *)malloc(fileLen+1); 

if (!buffer) 
{ 
    fprintf(stderr, "Memory error!"); 
          fclose(fp); 
    return; 
} 



fread(buffer, fileLen, 1, fp); 
fclose(fp); 

ao_play(device, buffer, buf_size); 
/* -- Close and shutdown -- */ 
ao_close(device); 
ao_shutdown(); 
return (0); 
} 
+5

你永遠不會初始化'buf_size' – samgak

+0

HI Samgak,感謝您的及時回覆。你是對的。你拯救了我的一天。我添加了以下內容,現在工作正常。 buf_size = format.bits/8 * format.channels * format.rate – Jro

回答

2

buf_size變量傳遞給ao_play沒有被初始化,裂紋最有可能發生的,因爲它是打過去樣本緩衝區的一端插入隨機內存。

根據您的編譯器設置,編譯器會警告你喜歡這個未初始化的變量漏洞(gcc只做它時,優化被打開,通過-Wuninitialized-Wall設置)。

+0

謝謝Samgak。此外,我還將默認驅動程序更改爲在libao.conf文件中,以便從那時起,每個事情都可以正常工作。感謝您的幫助。 – Jro