⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wavwriter.c

📁 LInux下Wave文件的读写、播放的类。还在wave文件头中写入了自定义信息。Linux平台下使用
💻 C
字号:
/*File Name:WavWriter.c*/
#include <pthread.h>

#include "Ldb.h"
#include "WavWriter.h"

#include "WavFile.h"
#include "ShellCmd.h"
#include "LocoSystem.h"
#include "Utility.h"
#include "Recorder.h"
#include "LocoLog.h"

/*****************************/
/*转换线程*/
pthread_t f_wavThrd;
/*录音停止标志*/
char f_wavStop = 1;
/*录音线程函数*/
void *wav_writer(void *arg);

/*原始声音文件保存目录*/
char f_sndDir[SYS_PATH_MAX_LEN];

/*wav文件保存目录*/
char f_wavDir[SYS_PATH_MAX_LEN];

/*****************************/
int  wav_writerStart(const char *pSnddir, const char *pWavDir)
{
	if (f_wavStop == 0 || pSnddir == NULL || pWavDir == NULL)
		return 0;

	memset(f_wavDir, 0, SYS_PATH_MAX_LEN);
	sprintf(f_wavDir, "%s/%s", pWavDir, SYS_WAV_DIR);
	memset(f_sndDir, 0, SYS_PATH_MAX_LEN);
	strcpy(f_sndDir, pSnddir);

	//创建保存wav的目录
	if(ldb_fileCreateDir(f_wavDir) == -1)
	{
		LDB_ERR_MSGF("can not create wav directory %s", f_wavDir);
		return -1;
	}

	//创建监视线程
	if( pthread_create(&f_wavThrd, NULL, wav_writer, NULL) != 0)
	{
		LDB_ERR_MSGF("can not create wav converter thread");
		return -1;
	} 
	
	f_wavStop = 0;

	return 0;
}

int  wav_writerIsStop()
{
	return f_wavStop;
}

void wav_writerStop()
{
	if (f_wavStop == 1)
		return;
	
	//等待线程结束
	f_wavStop = 1;

	if ( pthread_join(f_wavThrd, NULL) != 0)
	{
		LDB_DEBUG_MSGF("wav converter thread exits abnormally");
	}
}

//0 不用save, 1 save到u盘
int wav_isAccept(const char *pdir)
{
	char date[9];
	int i;
	printf("check acceptance of %s\n", pdir);

	//表示没有设置filter
	if (g_filter.days == 0)
		return 1;
	
	if (strlen(pdir) < strlen(".xxxxx.yyyymmdd") )
	{
		return 0;
	}
	
	memset(date, 0, sizeof(date));
	i = strlen(pdir) - sizeof("yyyymmdd");
	strncpy(date, pdir+i+1, 8); 
	for (i=0; i<g_filter.days; i++)
	{
		if (strcmp(date, g_filter.date[i]) == 0)
		{
			return 1;
		}
	}

	return 0;
}

void *wav_writer(void *arg)
{
	S_ShellDF df;
	int i, count, size;
	char **files;
	char **dirs;
	int dir_count, dir_index;
	char wav_dir[SYS_PATH_MAX_LEN];
	char wav_name[SYS_PATH_MAX_LEN];
	char snd_name[SYS_PATH_MAX_LEN];
	char snd_dir[SYS_PATH_MAX_LEN];
	char log[SYS_PATH_MAX_LEN];
	
	dir_count = ldb_fileGetDirList(f_sndDir, &dirs);
	if (dir_count == 0)
		goto WAV_WRITER_END;
	
	//记录U盘空间
	shell_df(&df, f_wavDir, LOCO_KILO_SIZE);
	for (dir_index=0; dir_index<dir_count; dir_index++)
	{
		if (0 == wav_isAccept(dirs[dir_index]) )
			continue;
		
		memset(snd_dir, 0, sizeof(snd_dir));
		sprintf(snd_dir, "%s/%s", f_sndDir, dirs[dir_index]);

		memset(log, 0, sizeof(log));
		sprintf(log, "download files under %s", snd_dir);
		log_info(log);
		
		count = ldb_fileGetList(snd_dir, &files);
		if (count == 0)
		{
			memset(log, 0, sizeof(log));
			sprintf(log, "No sound files under %s", dirs[dir_index]);
			log_info(log);

			continue;
		}
		
		memset(wav_dir, 0, sizeof(wav_dir));
		sprintf(wav_dir, "%s/%s", f_wavDir, dirs[dir_index]); 

		if(ldb_fileCreateDir(wav_dir) == -1)
		{
			memset(log, 0, sizeof(log));
			sprintf(log, "can not create wav directory %s", wav_dir);
			log_error(log);
			goto WAV_WRITER_END;
		}
		//获得播放文件列表
		for (i=0; i<count; i++)
		{
			if (f_wavStop == 1)
				goto WAV_WRITER_END;

			//检查磁盘空间
			if (df.free < SYS_UDISK_FULL)
			{
				log_error("Not enough space on U disk! Exiting download sound files");
				loco_audioPrompt(AP_UDISK_FULL);
				goto WAV_WRITER_END;
			}

			memset(snd_name, 0, SYS_PATH_MAX_LEN);
			memset(wav_name, 0, SYS_PATH_MAX_LEN);
			sprintf(snd_name, "%s/%s", snd_dir, files[i]);
			sprintf(wav_name, "%s/%s%s", wav_dir, files[i], ".wav");

			if (wavf_convert(snd_name, wav_name) == 0)
			{
				size = ldb_fileSize(wav_name)/LOCO_KILO_SIZE + 1;
				df.free -= size;

				//转换成功,删除整个目录
				LDB_DEBUG_MSGF("Successfully convert files %s to %s.", snd_name, wav_name);

				memset(log, 0, sizeof(log));
				sprintf(log, "Successfully convert files %s to %s.", snd_name, wav_name);
				log_info(log);
			}
			else
			{
				LDB_ERR_MSGF("Failed convert files %s.", snd_name);

				memset(log, 0, sizeof(log));
				sprintf(log, "Failed convert file %s.", snd_name);
				log_error(log);
			}

			free(files[i]);
			files[i] = NULL;
		}

		free(files);
		files = NULL;
	}

WAV_WRITER_END:	
	printf("wav converter finished\n");
	for (; i<count; i++)
	{
		if (files[i] != NULL)
		{
			free(files[i]);
			files[i] = NULL;
		}
	}
	if (files != NULL)
	{
		free(files);
		files = NULL;
	}

	for (i=0; i<dir_count; i++)
		free(dirs[i]);
	free(dirs);
	
	f_wavThrd = -1;
	f_wavStop = 1;
	
	loco_cmdFinished(CMD_RCD_SAVE, f_wavDir);
	return NULL;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -