customizemii-wiidb/CustomizeMii/CustomizeMii_BnsConvert.cs
2010-01-08 22:10:02 +00:00

448 lines
17 KiB
C#

/* This file is part of CustomizeMii
* Copyright (C) 2009 Leathl
*
* CustomizeMii is free software: you can redistribute it and/or
* modify it under the terms of the GNU General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* CustomizeMii is distributed in the hope that it will be
* useful, but WITHOUT ANY WARRANTY; without even the implied warranty
* of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
using System;
using System.IO;
using System.Windows.Forms;
using System.ComponentModel;
using WaveFile;
using System.Media;
namespace CustomizeMii
{
public partial class CustomizeMii_BnsConvert : Form
{
private bool lameExists;
private int loopStartSample;
private BackgroundWorker bwGatherInfo;
private int bitDepth;
private int sampleRate;
private int channelCount;
private int dataFormat;
private int loopCount;
private int loopStart;
private bool error = false;
private bool cancelled = false;
private int sampleCount;
private SoundPlayer sPlayer;
private bool mp3LengthKnown = false;
public string AudioFile { get { return tbAudioFile.Text; } }
public bool LoopNone { get { return rbNone.Checked; } }
public bool LoopFromAudio { get { return rbFromAudioFile.Checked; } }
public bool LoopManually { get { return rbEnterManually.Checked; } }
public int LoopStartSample { get { return loopStartSample; } }
public int ChannelCount { get { return channelCount; } }
public CustomizeMii_BnsConvert(bool lameExists)
{
InitializeComponent();
this.lameExists = lameExists;
}
private void CustomizeMii_BnsConvert_Load(object sender, EventArgs e)
{
//this.Size = new System.Drawing.Size(358, 220);
this.Size = new System.Drawing.Size(btnCancel.Location.X + btnCancel.Size.Width + 15, this.Size.Height);
this.CenterToParent();
bwGatherInfo = new BackgroundWorker();
bwGatherInfo.WorkerSupportsCancellation = true;
bwGatherInfo.DoWork += new DoWorkEventHandler(bwGatherInfo_DoWork);
byte[] soundBin = Wii.Tools.LoadFileToByteArray(CustomizeMii_Main.TempUnpackPath + "00000000.app_OUT\\meta\\sound.bin", 32, 16);
if (soundBin[0] == 'R' && soundBin[1] == 'I' && soundBin[2] == 'F' && soundBin[3] == 'F')
{ cbSourceSound.Enabled = true; }
else if (soundBin[0] == 'L' && soundBin[1] == 'Z' && soundBin[2] == '7' && soundBin[3] == '7')
if (soundBin[9] == 'R' && soundBin[10] == 'I' && soundBin[11] == 'F' && soundBin[12] == 'F')
{ cbSourceSound.Enabled = true; }
}
private void CustomizeMii_BnsConvert_FormClosing(object sender, FormClosingEventArgs e)
{
cancelled = true;
if (bwGatherInfo.IsBusy)
bwGatherInfo.CancelAsync();
}
private void rbSelectionChanged(object sender, EventArgs e)
{
tbLoopStart.Enabled = rbEnterManually.Checked;
if (tbAudioFile.Text.ToLower().EndsWith(".mp3")) { tbarLoopStartSample.Enabled = (rbEnterManually.Checked && mp3LengthKnown); }
else { tbarLoopStartSample.Enabled = rbEnterManually.Checked; }
if (!rbNone.Checked && this.Size.Width > 400)
this.Size = new System.Drawing.Size(gbPrelisten.Location.X + gbPrelisten.Size.Width + 15, this.Size.Height);
else if (rbNone.Checked && this.Size.Width > 400)
this.Size = new System.Drawing.Size(gbWaveInfo.Location.X + gbWaveInfo.Size.Width + 15, this.Size.Height);
}
private void tbLoopStart_KeyPress(object sender, KeyPressEventArgs e)
{
e.Handled = !char.IsDigit(e.KeyChar) && e.KeyChar != '\b';
}
private void btnConvert_Click(object sender, EventArgs e)
{
if (!File.Exists(tbAudioFile.Text) && tbAudioFile.Text != "Internal Sound")
{
tbAudioFile.Focus();
tbAudioFile.SelectAll();
return;
}
if (!int.TryParse(tbLoopStart.Text, out loopStartSample))
{
tbLoopStart.Focus();
tbLoopStart.SelectAll();
}
if (this.sPlayer != null) { this.sPlayer.Stop(); this.sPlayer.Dispose(); }
this.DialogResult = DialogResult.OK;
this.Close();
}
private void btnCancel_Click(object sender, EventArgs e)
{
if (this.sPlayer != null) { this.sPlayer.Stop(); this.sPlayer.Dispose(); }
this.DialogResult = DialogResult.Cancel;
this.Close();
}
private void cbSourceSound_CheckedChanged(object sender, EventArgs e)
{
if (cbSourceSound.Checked)
{
tbAudioFile.Text = "Internal Sound";
FileStream fs = new FileStream(CustomizeMii_Main.TempUnpackPath + "00000000.app_OUT\\meta\\sound.bin", FileMode.Open);
byte[] audio = new byte[fs.Length - 32];
int offset = 0;
fs.Seek(32, SeekOrigin.Begin);
fs.Read(audio, 0, audio.Length);
fs.Close();
if ((offset = Wii.Lz77.GetLz77Offset(audio)) != -1)
audio = Wii.Lz77.Decompress(audio, offset);
foreach (Label thisLabel in gbWaveInfo.Controls)
if (thisLabel.Name.ToLower().Contains("value"))
{
thisLabel.ForeColor = System.Drawing.Color.Black;
thisLabel.Text = "Gathering";
}
bwGatherInfo.RunWorkerAsync(audio);
//this.Size = new System.Drawing.Size(510, 220);
this.Size = new System.Drawing.Size(gbWaveInfo.Location.X + gbWaveInfo.Size.Width + 15, this.Size.Height);
}
else
{
if (tbAudioFile.Text == "Internal Sound")
tbAudioFile.Text = string.Empty;
//this.Size = new System.Drawing.Size(358, 220);
this.Size = new System.Drawing.Size(btnCancel.Location.X + btnCancel.Size.Width + 15, this.Size.Height);
}
}
private void btnBrowseAudioFile_Click(object sender, EventArgs e)
{
OpenFileDialog ofd = new OpenFileDialog();
if (lameExists)
{ ofd.Filter = "Wave|*.wav|MP3|*.mp3|All|*.wav;*.mp3"; ofd.FilterIndex = 3; }
else
{ ofd.Filter = "Wave|*.wav"; }
if (ofd.ShowDialog() == DialogResult.OK)
{
if (ofd.FileName != tbAudioFile.Text)
{
btnConvert.Enabled = false;
tbarLoopStartSample.Enabled = false;
mp3LengthKnown = false;
cbSourceSound.Checked = false;
tbAudioFile.Text = ofd.FileName;
if (ofd.FileName.EndsWith(".wav"))
{
rbFromAudioFile.Enabled = true;
foreach (Label thisLabel in gbWaveInfo.Controls)
if (thisLabel.Name.ToLower().Contains("value"))
{
thisLabel.ForeColor = System.Drawing.Color.Black;
thisLabel.Text = "Gathering";
}
bwGatherInfo.RunWorkerAsync(ofd.FileName);
this.Size = new System.Drawing.Size(gbWaveInfo.Location.X + gbWaveInfo.Size.Width + 15, this.Size.Height);
}
else if (ofd.FileName.EndsWith(".mp3"))
{
channelCount = 0;
btnConvert.Enabled = true;
if (rbFromAudioFile.Checked) rbNone.Checked = true;
rbFromAudioFile.Enabled = false;
this.Size = new System.Drawing.Size(btnCancel.Location.X + btnCancel.Size.Width + 15, this.Size.Height);
try
{
MP3Info mp3Info = new MP3Info(ofd.FileName);
tbarLoopStartSample.Maximum = mp3Info.AudioSamples;
mp3LengthKnown = true;
if (rbEnterManually.Checked) tbarLoopStartSample.Enabled = true;
}
catch { }
}
}
}
}
void bwGatherInfo_DoWork(object sender, DoWorkEventArgs e)
{
EventHandler UpdateValues = new EventHandler(this.UpdateValues);
try
{
Wave wave;
if (e.Argument is byte[])
{ wave = new Wave((byte[])e.Argument); }
else
{ wave = new Wave((string)e.Argument); }
try { this.sampleCount = wave.SampleCount; }
catch { }
try { bitDepth = wave.BitDepth; }
catch { bitDepth = -1; }
try { sampleRate = wave.SampleRate; }
catch { sampleRate = -1; }
try { channelCount = wave.ChannelCount; }
catch { channelCount = -1; }
try { dataFormat = wave.DataFormat; }
catch { dataFormat = -1; }
try { loopCount = wave.LoopCount; }
catch { loopCount = -1; }
try { loopStart = wave.LoopStart; }
catch { loopStart = -1; }
if (!cancelled)
this.Invoke(UpdateValues);
if (e.Argument is byte[])
{
byte[] audio = e.Argument as byte[];
using (FileStream fs = new FileStream(CustomizeMii_Main.TempWavePath, FileMode.Create))
{
fs.Write(audio, 0, audio.Length);
}
}
}
catch
{
error = true;
if (!cancelled)
this.Invoke(UpdateValues);
}
}
void UpdateValues(object sender, EventArgs e)
{
if (error == true)
{
foreach (Label thisLabel in gbWaveInfo.Controls)
if (thisLabel.Name.ToLower().Contains("value"))
{
thisLabel.Text = "Error";
thisLabel.ForeColor = System.Drawing.Color.Red;
}
error = false;
return;
}
bool statusOk = true;
tbarLoopStartSample.Maximum = this.sampleCount;
if (rbEnterManually.Checked) tbarLoopStartSample.Enabled = true;
if (bitDepth == -1) lbBitdepthValue.Text = "Error";
else lbBitdepthValue.Text = bitDepth.ToString();
if (sampleRate == -1) lbSamplerateValue.Text = "Error";
else lbSamplerateValue.Text = sampleRate.ToString();
if (dataFormat == -1) lbFormatValue.Text = "Error";
else if (dataFormat == 1) lbFormatValue.Text = "1 (PCM)";
else lbFormatValue.Text = dataFormat.ToString();
if (channelCount == -1) lbChannelCountValue.Text = "Error";
else if (channelCount == 1) lbChannelCountValue.Text = "1 (Mono)";
else if (channelCount == 2) lbChannelCountValue.Text = "2 (Stereo)";
else lbChannelCountValue.Text = channelCount.ToString();
if (loopCount == -1) lbLoopCountValue.Text = "Error";
else lbLoopCountValue.Text = loopCount.ToString();
if (loopCount == -1) lbLoopStartValue.Text = "Error";
else if (loopCount == 1) { lbLoopStartValue.Text = loopStart == -1 ? "Error" : loopStart.ToString(); }
else lbLoopStartValue.Text = "-";
if (lbBitdepthValue.Text == "Error" || bitDepth != 16)
{
lbBitdepthValue.ForeColor = System.Drawing.Color.Red;
statusOk = false;
}
else lbBitdepthValue.ForeColor = System.Drawing.Color.Green;
if (lbSamplerateValue.Text == "Error")
{
lbSamplerateValue.ForeColor = System.Drawing.Color.Red;
statusOk = false;
}
else lbSamplerateValue.ForeColor = System.Drawing.Color.Green;
if (lbFormatValue.Text == "Error" || dataFormat != 1)
{
lbFormatValue.ForeColor = System.Drawing.Color.Red;
statusOk = false;
}
else lbFormatValue.ForeColor = System.Drawing.Color.Green;
if (lbChannelCountValue.Text == "Error" || (channelCount > 2 || channelCount < 1))
{
lbChannelCountValue.ForeColor = System.Drawing.Color.Red;
statusOk = false;
}
else lbChannelCountValue.ForeColor = System.Drawing.Color.Green;
if (lbLoopCountValue.Text == "Error" || loopCount > 1)
lbLoopCountValue.ForeColor = System.Drawing.Color.Orange;
else lbLoopCountValue.ForeColor = System.Drawing.Color.Green;
if (lbLoopStartValue.Text == "Error" || lbLoopStartValue.Text == "-")
lbLoopStartValue.ForeColor = System.Drawing.Color.Orange;
else lbLoopStartValue.ForeColor = System.Drawing.Color.Green;
if (!statusOk)
{
lbStatusValue.Text = "Not OK!";
lbStatusValue.ForeColor = System.Drawing.Color.Red;
btnConvert.Enabled = false;
}
else
{
btnConvert.Enabled = true;
if (lbLoopCountValue.ForeColor == System.Drawing.Color.Orange ||
lbLoopStartValue.ForeColor == System.Drawing.Color.Orange)
{
lbStatusValue.Text = "No Loop!";
lbStatusValue.ForeColor = System.Drawing.Color.Orange;
if (rbFromAudioFile.Checked) rbNone.Checked = true;
rbFromAudioFile.Enabled = false;
}
else
{
rbFromAudioFile.Enabled = true;
lbStatusValue.Text = "OK!";
lbStatusValue.ForeColor = System.Drawing.Color.Green;
}
}
}
private void btnPlay_Click(object sender, EventArgs e)
{
if (btnPlay.Text == "Stop")
{
if (sPlayer != null)
{
sPlayer.Stop();
sPlayer = null;
btnPlay.Text = "Play Loop";
}
}
else
{
try
{
int loopStart = rbFromAudioFile.Checked ? int.Parse(lbLoopStartValue.Text) : int.Parse(tbLoopStart.Text);
Wave wave;
if (cbSourceSound.Checked)
{
using (FileStream fs = new FileStream(CustomizeMii_Main.TempUnpackPath + "00000000.app_OUT\\meta\\sound.bin", FileMode.Open))
{
byte[] audio = new byte[fs.Length - 32];
fs.Seek(32, SeekOrigin.Begin);
fs.Read(audio, 0, audio.Length);
wave = new Wave(audio);
}
}
else wave = new Wave(tbAudioFile.Text);
sPlayer = new SoundPlayer(wave.TrimStart(loopStart));
sPlayer.PlayLooping();
btnPlay.Text = "Stop";
}
catch (Exception ex)
{
sPlayer = null;
MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
private void tbarLoopStartSample_Scroll(object sender, EventArgs e)
{
try { tbLoopStart.Text = tbarLoopStartSample.Value.ToString(); }
catch { }
}
private void tbLoopStart_TextChanged(object sender, EventArgs e)
{
if (tbarLoopStartSample.Enabled)
try { tbarLoopStartSample.Value = int.Parse(tbLoopStart.Text); }
catch { }
}
}
}