📄 ncwnd_detail.cpp~
字号:
/****************************************************************************************** 添加振铃或留提示语 ******************************************************************************************/void AddRingAnswer (void){ if (g_nTimeOut<=0) //录音长度超过0秒才能添加 { InformDlg("无法添加!","错误信息"); return; } const char *curname = g_AddRingWnd_Ipt->value(); //当前振铃或留言名称 if ( strcmp(curname, LOCAL_TYPE_COMMON)==0 || strcmp(curname, DIAL_TYPE_COMMON)==0 ) { char t[128]; sprintf(t, "%s 是系统保留名称", curname); InformDlg (t,"错误信息"); return; } Flve_Combo *c; if (record_operation_id==1) c= cbo_local_setup_sound; else c =cbo_auto_dial_sound; int max=0; max = c->item.count(); for (int i=0; i<max; ++i) //判断是否与现有的名称重名 { const char *title = c->item[i].item(); if (strcmp(title, curname)==0) { InformDlg("所选文件名已经存在!","错误信息"); return; } } char despath[256]; sprintf(despath, "%s/%s", SOUND_FILE_PATH, curname); char cmd[128]; //拷贝声音到声音文件目录 sprintf(cmd, "mv %s %s", ALERT_TEMP_SOUNDFILE, despath); system(cmd); //这里应该判断system的返回值,判断存储空间是否够用 // c->item.add(curname); cbo_local_setup_sound->item.add(curname); cbo_auto_dial_sound->item.add(curname); g_AddRingWnd->hide(); g_AddRingWnd_Slider->value(0); g_nTimeOut = 0;// IsChanged = true;}/****************************************************************************************** 添加振铃窗口,按钮消息处理 ******************************************************************************************/void cb_AddRingWnd_Btn (Fl_Button *o, void *p){ int i = (int)p; switch (i) { case 1: //“录音”按钮 { if ( !g_bRecording ) { Record(o); } } break; case 2: //“放音”按钮 { if ( !g_bPlaying && g_nTimeOut!=0 ) { Play(o); } } break; case 3: //“停止”按钮 { g_bRecording = false; g_bPlaying = false; usleep(200000); //进程阻塞0.2秒 g_AddRingWnd_Btn_Play->activate(); g_AddRingWnd_Btn_Record->activate(); g_AddRingWnd_Btn_Add->activate(); g_AddRingWnd_Btn_Cancel->activate(); g_AddRingWnd_Btn_Record->value(0); g_AddRingWnd_Btn_Play->value(0); } break; case 4: //“添加”按钮 AddRingAnswer(); break; case 5: //“取消”按钮 { g_AddRingWnd->hide(); g_AddRingWnd_Slider->value(0); g_nTimeOut = 0; unlink(ALERT_TEMP_SOUNDFILE); } break; }}/****************************************************************************************** 录音计时器 ******************************************************************************************/void RecordTimer (void *i){ static int p=0; if (1==(int)i) //如果用户刚按下录音按钮则直接进入返回等待下一秒的事件 { p = 0; g_AddRingWnd_Slider->value(0); sprintf(g_szTimeBoxTitle, "长度 : %02d / %02d 秒", p, g_nDeftTimeOut); g_AddRingWnd_Box->redraw(); Fl::repeat_timeout(1.0, RecordTimer); return; } if ( !g_bRecording ) //如果用户按下停止按钮,则返回(在这种情况下,滑杆位置保持不变) { g_nTimeOut = p; goto exit; } else if ( (--g_nTimeOut)!=0 ) //如果未到达规定时限,滑杆向前进一格 { g_AddRingWnd_Slider->value(++p); sprintf(g_szTimeBoxTitle, "长度 : %02d / %02d 秒", p, g_nDeftTimeOut); g_AddRingWnd_Box->redraw(); Fl::repeat_timeout(1.0, RecordTimer); return; } else //达到时限时,滑杆再向前进一格 { g_AddRingWnd_Slider->value(++p); sprintf(g_szTimeBoxTitle, "长度 : %02d / %02d 秒", p, g_nDeftTimeOut); g_AddRingWnd_Box->redraw(); g_nTimeOut = p; }exit: g_AddRingWnd_Btn_Record->value(0); g_AddRingWnd_Btn_Play->activate(); g_AddRingWnd_Btn_Add->activate(); g_AddRingWnd_Btn_Cancel->activate(); g_bRecording = false;}/****************************************************************************************** 录音函数 ******************************************************************************************/int Record (Fl_Button *o){ //录音之前要检查声音设备是否可用,还要删除临时文件 remove(ALERT_TEMP_SOUNDFILE); printf("Before open audio device !\n"); int audio_fd = open(AUDIODEV, O_RDONLY | O_NONBLOCK); //打开声音设备 if (-1==audio_fd) { InformDlg("打开声音设备出错,无法录音!","错误信息"); return -1; } printf("After open audio dev !\n"); o->value(1); g_nTimeOut = g_nDeftTimeOut; g_AddRingWnd_Btn_Play->deactivate(); g_AddRingWnd_Btn_Add->deactivate(); g_AddRingWnd_Btn_Cancel->deactivate(); g_AddRingWnd_Slider->maximum(g_nDeftTimeOut); g_bRecording = true; RecordTimer((void *)1); pthread_t pid; pthread_create(&pid, NULL, Record_Thread, (void *)audio_fd); return 1;}/****************************************************************************************** 放音计时器 ******************************************************************************************/void PlayTimer (void *i){ static int p=0; static int prevTimeout=0; if (1==(int)i) //如果用户刚按下录音按钮则直接进入返回等待下一秒的事件 { p = 0; prevTimeout = g_nTimeOut; g_AddRingWnd_Slider->value(0); sprintf(g_szTimeBoxTitle, "长度 : %02d / %02d 秒", p, g_nDeftTimeOut); g_AddRingWnd_Box->redraw(); Fl::repeat_timeout(1.0, PlayTimer); return; } if ( !g_bPlaying ) //如果用户按下停止按钮,则返回(在这种情况下,滑杆位置保持不变) { g_nTimeOut = prevTimeout; goto exit; } else if ( (--g_nTimeOut)!=0 ) //如果未到达规定时限,滑杆向前进一格 { g_AddRingWnd_Slider->value(++p); sprintf(g_szTimeBoxTitle, "长度 : %02d / %02d 秒", p, g_nDeftTimeOut); g_AddRingWnd_Box->redraw(); Fl::repeat_timeout(1.0, PlayTimer); return; } else //达到时限时,滑杆再向前进一格 { g_AddRingWnd_Slider->value(++p); sprintf(g_szTimeBoxTitle, "长度 : %02d / %02d 秒", p, g_nDeftTimeOut); g_AddRingWnd_Box->redraw(); g_nTimeOut = prevTimeout; }exit: g_AddRingWnd_Btn_Play->value(0); g_AddRingWnd_Btn_Record->activate(); g_AddRingWnd_Btn_Add->activate(); g_AddRingWnd_Btn_Cancel->activate(); g_bPlaying = false;}/****************************************************************************************** 放音函数 ******************************************************************************************/int Play (Fl_Button *o){ int audio_fd = open(AUDIODEV, O_WRONLY); //打开声音设备 if (-1==audio_fd) { fl_alert("打开声音设备出错,无法录音!"); return -1; } o->value(1); g_AddRingWnd_Btn_Record->deactivate(); g_AddRingWnd_Btn_Add->deactivate(); g_AddRingWnd_Btn_Cancel->deactivate(); g_AddRingWnd_Slider->maximum(g_nDeftTimeOut); g_bPlaying = true; PlayTimer((void *)1); pthread_t pid; pthread_create(&pid, NULL, Play_Thread, (void *)audio_fd); return 1;}/****************************************************************************************** 录音线程函数 ******************************************************************************************/void *Record_Thread (void *p){ int audio_fd = (int)p; RecordToFile(audio_fd, ALERT_TEMP_SOUNDFILE, &g_bRecording,2); close(audio_fd); pthread_exit(NULL);}/****************************************************************************************** 放音线程函数 ******************************************************************************************/void *Play_Thread (void *p){ int audio_fd = (int)p; PlaySound(audio_fd, ALERT_TEMP_SOUNDFILE, &g_bPlaying,2); close(audio_fd); pthread_exit(NULL);}/****************************************************************************************** 添加振铃窗口消息处理函数 ******************************************************************************************/void cb_ShowAddRingWnd (Fl_Window *o){ if ( g_bPlaying || g_bRecording ) { return; } o->hide();}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -