/**
 * This script render a new audio file for all selected audio events and add
 * this file as a new take. Designed to help reduce problems with hard drives
 * connected via firewire.
 * 
 * Written By: Edward Troxel
 * Modified: 05-28-2003
 * Version 1
 **/

import System;
import System.Text;
import System.IO;
import System.Windows.Forms;
import System.Object;
import SonicFoundry.Vegas;

// here are some default variables for the GUI.
var defaultBasePath = "D:\\vmedia\\";

// set this to true if you want to allow files to be overwritten
var overwriteExistingFiles = false;

try {

  var SubClipNum = 1;
  var stream;
  var renderStart;
  var renderLength;

  //Mute/unsolo all tracks
  var trackEnum = new Enumerator(Vegas.Project.Tracks);
  while (!trackEnum.atEnd()) {
    var track : Track = Track(trackEnum.item());

    if (track.IsAudio) {
      track.Mute = true;
      track.Solo = false;
    }

    trackEnum.moveNext();
  }


  //Go through the list of Tracks
  trackEnum = new Enumerator(Vegas.Project.Tracks);
  while (!trackEnum.atEnd()) {
    track = Track(trackEnum.item());

    if (track.IsAudio) {

      //Go through the list of Events
      var eventEnum = new Enumerator(track.Events);
      while (!eventEnum.atEnd()) {
        var evnt : TrackEvent = TrackEvent(eventEnum.item());

        if (evnt.Selected) {
          track.Mute = false;
          track.Solo = true;

          
          var renderer = FindRenderer(/Sonic Foundry Wave64/);
          if (null == renderer)
              throw "failed to find renderer";

          var template = FindRenderTemplate(renderer, /48,000 Hz, 16 Bit, Stereo, PCM/);
          if (null == template)
              throw "failed to find template";

          renderStart = evnt.Start;
          renderLength = evnt.Length;

          var NewFPath = defaultBasePath + "Aud" + SubClipNum + ".W64";
          DoRender(NewFPath, renderer, template, renderStart, renderLength);

          //Add the media to the new track
          var mymedia = new Media(NewFPath);
          stream = mymedia.Streams.GetItemByMediaType(MediaType.Audio, 0);
          if (null == stream) 
            throw "media contains no audio streams";

          var myNewtake = new Take(stream);
          evnt.Takes.Add(myNewtake);


          SubClipNum++;

        }
        eventEnum.moveNext();
      }
    }
    trackEnum.moveNext();
  }

  //unmute/solo all tracks
  trackEnum = new Enumerator(Vegas.Project.Tracks);
  while (!trackEnum.atEnd()) {
    track = Track(trackEnum.item());

    if (track.IsAudio) {
      track.Mute = false;
      track.Solo = false;
    }

    trackEnum.moveNext();
  }

} catch (e) {
    MessageBox.Show(e);
}

// perform the render.  The Render method returns a member of the
// RenderStatus enumeration.  If it is anything other than OK, exit
// the loops.  This will throw an error message string if the render
// does not complete successfully.
function DoRender(fileName, rndr, rndrTemplate, start, length) {
    // make sure the file does not already exist
    if (!overwriteExistingFiles && File.Exists(fileName)) {
        throw "File already exists: " + fileName;
    }

    // perform the render.  The Render method returns
    // a member of the RenderStatus enumeration.  If
    // it is anything other than OK, exit the loops.
    var status = Vegas.Render(fileName, rndrTemplate, start, length);

    // if the render completed successfully, just return
    if (status == RenderStatus.Complete)
        return;

    // if the user canceled, throw out a special message that won't be
    // displayed.
    if (status == RenderStatus.Canceled) {
        var cancelMsg = new String("User canceled");
        cancelMsg.skipMessageBox = true;
        throw cancelMsg;
    }

    // if the render failed, throw out a detailed error message.
    var msg : StringBuilder = new StringBuilder("Render failed:\n");
    msg.Append("\n    file name: ");
    msg.Append(fileName);
    msg.Append("\n    Renderer: ");
    msg.Append(rndr.FileTypeName);
    msg.Append("\n    Template: ");
    msg.Append(rndrTemplate.Name);
    msg.Append("\n    Start Time: ");
    msg.Append(start.ToString());
    msg.Append("\n    Length: ");
    msg.Append(length.ToString());
    throw msg;
}

function FindRenderer(rendererRegExp : RegExp) : Renderer {
  var rendererEnum : Enumerator = new Enumerator(Vegas.Renderers);

  while (!rendererEnum.atEnd()) {
    var renderer : Renderer = Renderer(rendererEnum.item());
    if (null != renderer.FileTypeName.match(rendererRegExp)) {
        return renderer;
    }
    rendererEnum.moveNext();
  }
return null;
}

function FindRenderTemplate(renderer : Renderer, templateRegExp : RegExp) : RenderTemplate {
  var templateEnum : Enumerator = new Enumerator(renderer.Templates);

  while (!templateEnum.atEnd()) {
    var renderTemplate : RenderTemplate = RenderTemplate(templateEnum.item());
    if (null != renderTemplate.Name.match(templateRegExp)) {
        return renderTemplate;
    }
    templateEnum.moveNext();
  }
  return null;
}

