xcdrdao.cc
上传用户:weiliju62
上传日期:2007-01-06
资源大小:619k
文件大小:4k
源码类别:

SCSI/ASPI

开发平台:

MultiPlatform

  1. /*  cdrdao - write audio CD-Rs in disc-at-once mode
  2.  *
  3.  *  Copyright (C) 1998  Andreas Mueller <mueller@daneb.ping.de>
  4.  *
  5.  *  This program is free software; you can redistribute it and/or modify
  6.  *  it under the terms of the GNU General Public License as published by
  7.  *  the Free Software Foundation; either version 2 of the License, or
  8.  *  (at your option) any later version.
  9.  *
  10.  *  This program is distributed in the hope that it will be useful,
  11.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13.  *  GNU General Public License for more details.
  14.  *
  15.  *  You should have received a copy of the GNU General Public License
  16.  *  along with this program; if not, write to the Free Software
  17.  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  18.  */
  19. /*
  20.  * $Log: xcdrdao.cc,v $
  21.  * Revision 1.1  1998/11/20 18:53:45  mueller
  22.  * Initial revision
  23.  *
  24.  */
  25. #include <stdio.h>
  26. #include <stdarg.h>
  27. #include <signal.h>
  28. #include <stdlib.h>
  29. #include <gtk--.h>
  30. #include <gtk/gtk.h>
  31. #include "config.h"
  32. #include "xcdrdao.h"
  33. #include "TocEdit.h"
  34. #include "MainWindow.h"
  35. #include "TrackInfoDialog.h"
  36. #include "TocInfoDialog.h"
  37. #include "AddSilenceDialog.h"
  38. #include "AddFileDialog.h"
  39. #include "DeviceConfDialog.h"
  40. #include "RecordDialog.h"
  41. #include "RecordProgressDialog.h"
  42. #include "guiUpdate.h"
  43. #include "CdDevice.h"
  44. #include "ProcessMonitor.h"
  45. #include "Settings.h"
  46. #include "port.h"
  47. MainWindow *MAIN_WINDOW = NULL;
  48. TrackInfoDialog *TRACK_INFO_DIALOG = NULL;
  49. TocInfoDialog *TOC_INFO_DIALOG = NULL;
  50. AddSilenceDialog *ADD_SILENCE_DIALOG = NULL;
  51. AddFileDialog *ADD_FILE_DIALOG = NULL;
  52. DeviceConfDialog *DEVICE_CONF_DIALOG = NULL;
  53. RecordDialog *RECORD_DIALOG = NULL;
  54. ProcessMonitor *PROCESS_MONITOR = NULL;
  55. RecordProgressDialogPool *RECORD_PROGRESS_POOL = NULL;
  56. Settings *SETTINGS = NULL;
  57. static int VERBOSE = 0;
  58. static int PROCESS_MONITOR_SIGNAL_BLOCKED = 0;
  59. void message(int level, const char *fmt, ...)
  60. {
  61.   long len = strlen(fmt);
  62.   char last = len > 0 ? fmt[len - 1] : 0;
  63.   va_list args;
  64.   va_start(args, fmt);
  65.   if (level < 0) {
  66.     switch (level) {
  67.     case -1:
  68.       fprintf(stderr, "Warning: ");
  69.       break;
  70.     case -2:
  71.       fprintf(stderr, "ERROR: ");
  72.       break;
  73.     case -3:
  74.       fprintf(stderr, "INTERNAL ERROR: ");
  75.       break;
  76.     default:
  77.       fprintf(stderr, "FATAL ERROR: ");
  78.       break;
  79.     }
  80.     vfprintf(stderr, fmt, args);
  81.     if (last != ' ' && last != 'r')
  82.       fprintf(stderr, "n");
  83.     
  84.     fflush(stderr);
  85.     if (level <= -10)
  86.       exit(-1);
  87.   }
  88.   else if (level <= VERBOSE) {
  89.     vfprintf(stdout, fmt, args);
  90.     if (last != ' ' && last != 'r')
  91.       fprintf(stdout, "n");
  92.     fflush(stdout);
  93.   }
  94.   va_end(args);
  95. }
  96. void blockProcessMonitorSignals()
  97. {
  98.   if (PROCESS_MONITOR_SIGNAL_BLOCKED == 0)
  99.     blockSignal(SIGCHLD);
  100.   PROCESS_MONITOR_SIGNAL_BLOCKED++;
  101. }
  102. void unblockProcessMonitorSignals()
  103. {
  104.   if (PROCESS_MONITOR_SIGNAL_BLOCKED > 0) {
  105.     PROCESS_MONITOR_SIGNAL_BLOCKED--;
  106.     if (PROCESS_MONITOR_SIGNAL_BLOCKED == 0)
  107.       unblockSignal(SIGCHLD);
  108.   }
  109. }
  110. static RETSIGTYPE signalHandler(int sig)
  111. {
  112.   if (sig == SIGCHLD)
  113.     PROCESS_MONITOR->handleSigChld();
  114. }
  115. int main (int argc, char **argv)
  116. {
  117.   const char *s;
  118.   string settingsPath;
  119.   Gtk_Main application(&argc, &argv);
  120.   Gtk_ButtonBox::set_child_size_default(50, 10);
  121.   // settings
  122.   SETTINGS = new Settings;
  123.   if ((s = getenv("HOME")) != NULL) {
  124.     settingsPath = s;
  125.     settingsPath += "/.xcdrdao";
  126.     SETTINGS->read(settingsPath.c_str());
  127.   }
  128.   // setup process monitor
  129.   PROCESS_MONITOR = new ProcessMonitor;
  130.   installSignalHandler(SIGCHLD, signalHandler);
  131.   // setup periodic GUI updates
  132.   connect_to_function(application.timeout(2000), &guiUpdatePeriodic);
  133.   installSignalHandler(SIGPIPE, SIG_IGN);
  134.   // scan for SCSI devices
  135.   CdDevice::scan();
  136.   TRACK_INFO_DIALOG = new TrackInfoDialog;
  137.   TOC_INFO_DIALOG = new TocInfoDialog;
  138.   ADD_SILENCE_DIALOG = new AddSilenceDialog;
  139.   ADD_FILE_DIALOG = new AddFileDialog;
  140.   DEVICE_CONF_DIALOG = new DeviceConfDialog;
  141.   RECORD_DIALOG = new RecordDialog;
  142.   RECORD_PROGRESS_POOL = new RecordProgressDialogPool;
  143.   // create TocEdit object
  144.   TocEdit *tocEdit = new TocEdit(NULL, NULL);
  145.   if (argc > 1) {
  146.     if (tocEdit->readToc(argv[1]) != 0)
  147.       exit(1);
  148.   }
  149.   
  150.   MAIN_WINDOW = new MainWindow(tocEdit);
  151.   MAIN_WINDOW->show();
  152.   guiUpdate();
  153.   application.run();
  154.   s = settingsPath.c_str();
  155.   if (s != NULL && *s != 0) 
  156.     SETTINGS->write(s);
  157.   return 0;
  158. }