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

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: AddSilenceDialog.cc,v $
  21.  * Revision 1.4  1999/08/07 16:27:28  mueller
  22.  * Applied patch from Yves Bastide:
  23.  * * prefixing member function names with their class name in connect_to_method
  24.  * * explicitly `const_cast'ing a cast to const
  25.  *
  26.  * Revision 1.3  1999/03/06 13:55:18  mueller
  27.  * Adapted to Gtk-- version 0.99.1
  28.  *
  29.  * Revision 1.2  1999/01/30 19:45:43  mueller
  30.  * Fixes for compilation with Gtk-- 0.11.1.
  31.  *
  32.  */
  33. static char rcsid[] = "$Id$";
  34. #include <stdio.h>
  35. #include <limits.h>
  36. #include <math.h>
  37. #include <assert.h>
  38. #include "AddSilenceDialog.h"
  39. #include "TocEdit.h"
  40. #include "guiUpdate.h"
  41. #include "Sample.h"
  42. AddSilenceDialog::AddSilenceDialog()
  43. {
  44.   Gtk_Button *button;
  45.   Gtk_VBox *vbox;
  46.   Gtk_HBox *hbox;
  47.   tocEdit_ = NULL;
  48.   active_ = 0;
  49.   mode_ = M_APPEND;
  50.   minutes_ = new Gtk_Entry;
  51.   seconds_ = new Gtk_Entry;
  52.   frames_ = new Gtk_Entry;
  53.   samples_ = new Gtk_Entry;
  54.   Gtk_Frame *frame = new Gtk_Frame(string("Length of Silence"));
  55.   Gtk_Table *table = new Gtk_Table(4, 2, FALSE);
  56.   table->set_row_spacings(5);
  57.   table->set_col_spacings(5);
  58.   hbox = new Gtk_HBox;
  59.   hbox->pack_start(*table, TRUE, TRUE, 5);
  60.   table->show();
  61.   vbox = new Gtk_VBox;
  62.   vbox->pack_start(*hbox, FALSE, FALSE, 5);
  63.   hbox->show();
  64.   frame->add(vbox);
  65.   vbox->show();
  66.   
  67.   Gtk_Label *label = new Gtk_Label(string("Minutes:"));
  68.   table->attach(*label, 0, 1, 0, 1, GTK_SHRINK);
  69.   label->show();
  70.   table->attach(*minutes_, 1, 2, 0, 1);
  71.   minutes_->show();
  72.   label = new Gtk_Label(string("Seconds:"));
  73.   table->attach(*label, 0, 1, 1, 2, GTK_SHRINK);
  74.   label->show();
  75.   table->attach(*seconds_, 1, 2, 1, 2);
  76.   seconds_->show();
  77.   label = new Gtk_Label(string("Frames:"));
  78.   table->attach(*label, 0, 1, 2, 3, GTK_SHRINK);
  79.   label->show();
  80.   table->attach(*frames_, 1, 2, 2, 3);
  81.   frames_->show();
  82.   label = new Gtk_Label(string("Samples:"));
  83.   table->attach(*label, 0, 1, 3, 4, GTK_SHRINK);
  84.   label->show();
  85.   table->attach(*samples_, 1, 2, 3, 4);
  86.   samples_->show();
  87.   hbox = new Gtk_HBox;
  88.   hbox->pack_start(*frame, TRUE, TRUE, 10);
  89.   frame->show();
  90.   get_vbox()->pack_start(*hbox, FALSE, FALSE, 10);
  91.   hbox->show();
  92.   get_vbox()->show();
  93.   Gtk_HButtonBox *bbox = new Gtk_HButtonBox(GTK_BUTTONBOX_SPREAD);
  94.   applyButton_ = new Gtk_Button(string(" Apply "));
  95.   bbox->pack_start(*applyButton_);
  96.   applyButton_->show();
  97.   connect_to_method(applyButton_->clicked, this,
  98.     &AddSilenceDialog::applyAction);
  99.   button = new Gtk_Button(string(" Clear "));
  100.   bbox->pack_start(*button);
  101.   button->show();
  102.   connect_to_method(button->clicked, this, &AddSilenceDialog::clearAction);
  103.   button = new Gtk_Button(string(" Cancel "));
  104.   bbox->pack_start(*button);
  105.   button->show();
  106.   connect_to_method(button->clicked, this, &AddSilenceDialog::cancelAction);
  107.   get_action_area()->pack_start(*bbox);
  108.   bbox->show();
  109.   get_action_area()->show();
  110. }
  111. AddSilenceDialog::~AddSilenceDialog()
  112. {
  113. }
  114. void AddSilenceDialog::mode(Mode m)
  115. {
  116.   mode_ = m;
  117.   switch (mode_) {
  118.   case M_APPEND:
  119.     set_title(string("Append Silence"));
  120.     break;
  121.   case M_INSERT:
  122.     set_title(string("Insert Silence"));
  123.     break;
  124.   }
  125. }
  126. void AddSilenceDialog::start(TocEdit *tocEdit)
  127. {
  128.   if (active_) {
  129.     get_window().raise();
  130.     return;
  131.   }
  132.   active_ = 1;
  133.   update(UPD_ALL, tocEdit);
  134.   show();
  135. }
  136. void AddSilenceDialog::stop()
  137. {
  138.   if (active_) {
  139.     hide();
  140.     active_ = 0;
  141.   }
  142. }
  143. void AddSilenceDialog::update(unsigned long level, TocEdit *tocEdit)
  144. {
  145.   if (!active_)
  146.     return;
  147.   if (tocEdit == NULL) {
  148.     applyButton_->set_sensitive(FALSE);
  149.     tocEdit_ = NULL;
  150.     return;
  151.   }
  152.   if ((level & UPD_EDITABLE_STATE) || tocEdit_ == NULL) {
  153.     applyButton_->set_sensitive(tocEdit->editable() ? TRUE : FALSE);
  154.   }
  155.   tocEdit_ = tocEdit;
  156. }
  157. gint AddSilenceDialog::delete_event_impl(GdkEventAny*)
  158. {
  159.   stop();
  160.   return 1;
  161. }
  162. void AddSilenceDialog::cancelAction()
  163. {
  164.   stop();
  165. }
  166. void AddSilenceDialog::clearAction()
  167. {
  168.   minutes_->set_text(string(""));
  169.   seconds_->set_text(string(""));
  170.   frames_->set_text(string(""));
  171.   samples_->set_text(string(""));
  172. }
  173. void AddSilenceDialog::applyAction()
  174. {
  175.   unsigned long length = 0;
  176.   char buf[20];
  177.   long val;
  178.   if (tocEdit_ == NULL || !tocEdit_->editable())
  179.     return;
  180.   const char *s = minutes_->get_text().c_str();
  181.   if (s != NULL && *s != 0) {
  182.     val = atol(s);
  183.     length += val * 60 * 75 * SAMPLES_PER_BLOCK;
  184.     sprintf(buf, "%ld", val);
  185.     minutes_->set_text(string(buf));
  186.   }
  187.   s = seconds_->get_text().c_str();
  188.   if (s != NULL && *s != 0) {
  189.     val = atol(s);
  190.     length += val * 75 * SAMPLES_PER_BLOCK;
  191.     sprintf(buf, "%ld", val);
  192.     seconds_->set_text(string(buf));
  193.   }
  194.   s = frames_->get_text().c_str();
  195.   if (s != NULL && *s != 0) {
  196.     val = atol(s);
  197.     length += val * SAMPLES_PER_BLOCK;
  198.     sprintf(buf, "%ld", val);
  199.     frames_->set_text(string(buf));
  200.   }
  201.   
  202.   s = samples_->get_text().c_str();
  203.   if (s != NULL && *s != 0) {
  204.     val = atol(s);
  205.     length += val;
  206.     sprintf(buf, "%ld", val);
  207.     samples_->set_text(string(buf));
  208.   }
  209.   
  210.   if (length > 0) {
  211.     unsigned long pos;
  212.     switch (mode_) {
  213.     case M_APPEND:
  214.       tocEdit_->appendSilence(length);
  215.       break;
  216.     case M_INSERT:
  217.       if (tocEdit_->sampleMarker(&pos)) {
  218. tocEdit_->insertSilence(length, pos);
  219.       }
  220.       break;
  221.     }
  222.     guiUpdate();
  223.   }
  224. }