Added support for ADPCM codec, new features and bugfix in audio player

This commit is contained in:
kolardavid 2018-01-11 20:55:56 +01:00
parent 7dbaa8dd82
commit 54681da20a
4 changed files with 1113 additions and 871 deletions

View File

@ -32,6 +32,9 @@
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(AwcForm)); System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(AwcForm));
this.MainTabControl = new System.Windows.Forms.TabControl(); this.MainTabControl = new System.Windows.Forms.TabControl();
this.PlayerTabPage = new System.Windows.Forms.TabPage(); this.PlayerTabPage = new System.Windows.Forms.TabPage();
this.LabelInfo = new System.Windows.Forms.Label();
this.LabelTime = new System.Windows.Forms.Label();
this.StopButton = new System.Windows.Forms.Button();
this.VolumeLabel = new System.Windows.Forms.Label(); this.VolumeLabel = new System.Windows.Forms.Label();
this.chbAutoJump = new System.Windows.Forms.CheckBox(); this.chbAutoJump = new System.Windows.Forms.CheckBox();
this.PrevButton = new System.Windows.Forms.Button(); this.PrevButton = new System.Windows.Forms.Button();
@ -41,13 +44,18 @@
this.PlaylistNameHeader = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); this.PlaylistNameHeader = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
this.PlaylistTypeHeader = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); this.PlaylistTypeHeader = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
this.PlaylistLengthHeader = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); this.PlaylistLengthHeader = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
this.contextMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components);
this.ExportAsWav = new System.Windows.Forms.ToolStripMenuItem();
this.VolumeTrackBar = new System.Windows.Forms.TrackBar(); this.VolumeTrackBar = new System.Windows.Forms.TrackBar();
this.PositionTrackBar = new System.Windows.Forms.TrackBar(); this.PositionTrackBar = new System.Windows.Forms.TrackBar();
this.DetailsTabPage = new System.Windows.Forms.TabPage(); this.DetailsTabPage = new System.Windows.Forms.TabPage();
this.DetailsPropertyGrid = new CodeWalker.WinForms.PropertyGridFix(); this.DetailsPropertyGrid = new CodeWalker.WinForms.PropertyGridFix();
this.Timer = new System.Windows.Forms.Timer(this.components); this.Timer = new System.Windows.Forms.Timer(this.components);
this.saveFileDialog = new System.Windows.Forms.SaveFileDialog();
this.PlaylistSizeHeader = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
this.MainTabControl.SuspendLayout(); this.MainTabControl.SuspendLayout();
this.PlayerTabPage.SuspendLayout(); this.PlayerTabPage.SuspendLayout();
this.contextMenuStrip.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.VolumeTrackBar)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.VolumeTrackBar)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.PositionTrackBar)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.PositionTrackBar)).BeginInit();
this.DetailsTabPage.SuspendLayout(); this.DetailsTabPage.SuspendLayout();
@ -61,11 +69,14 @@
this.MainTabControl.Location = new System.Drawing.Point(0, 0); this.MainTabControl.Location = new System.Drawing.Point(0, 0);
this.MainTabControl.Name = "MainTabControl"; this.MainTabControl.Name = "MainTabControl";
this.MainTabControl.SelectedIndex = 0; this.MainTabControl.SelectedIndex = 0;
this.MainTabControl.Size = new System.Drawing.Size(576, 358); this.MainTabControl.Size = new System.Drawing.Size(576, 361);
this.MainTabControl.TabIndex = 0; this.MainTabControl.TabIndex = 0;
// //
// PlayerTabPage // PlayerTabPage
// //
this.PlayerTabPage.Controls.Add(this.LabelInfo);
this.PlayerTabPage.Controls.Add(this.LabelTime);
this.PlayerTabPage.Controls.Add(this.StopButton);
this.PlayerTabPage.Controls.Add(this.VolumeLabel); this.PlayerTabPage.Controls.Add(this.VolumeLabel);
this.PlayerTabPage.Controls.Add(this.chbAutoJump); this.PlayerTabPage.Controls.Add(this.chbAutoJump);
this.PlayerTabPage.Controls.Add(this.PrevButton); this.PlayerTabPage.Controls.Add(this.PrevButton);
@ -77,25 +88,54 @@
this.PlayerTabPage.Location = new System.Drawing.Point(4, 22); this.PlayerTabPage.Location = new System.Drawing.Point(4, 22);
this.PlayerTabPage.Name = "PlayerTabPage"; this.PlayerTabPage.Name = "PlayerTabPage";
this.PlayerTabPage.Padding = new System.Windows.Forms.Padding(3); this.PlayerTabPage.Padding = new System.Windows.Forms.Padding(3);
this.PlayerTabPage.Size = new System.Drawing.Size(568, 332); this.PlayerTabPage.Size = new System.Drawing.Size(568, 335);
this.PlayerTabPage.TabIndex = 0; this.PlayerTabPage.TabIndex = 0;
this.PlayerTabPage.Text = "Player"; this.PlayerTabPage.Text = "Player";
this.PlayerTabPage.UseVisualStyleBackColor = true; this.PlayerTabPage.UseVisualStyleBackColor = true;
// //
// LabelInfo
//
this.LabelInfo.AutoSize = true;
this.LabelInfo.Location = new System.Drawing.Point(8, 247);
this.LabelInfo.Name = "LabelInfo";
this.LabelInfo.Size = new System.Drawing.Size(0, 13);
this.LabelInfo.TabIndex = 12;
//
// LabelTime
//
this.LabelTime.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.LabelTime.Location = new System.Drawing.Point(285, 308);
this.LabelTime.Name = "LabelTime";
this.LabelTime.Size = new System.Drawing.Size(114, 17);
this.LabelTime.TabIndex = 11;
this.LabelTime.TextAlign = System.Drawing.ContentAlignment.TopCenter;
//
// StopButton
//
this.StopButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.StopButton.Enabled = false;
this.StopButton.Location = new System.Drawing.Point(211, 304);
this.StopButton.Name = "StopButton";
this.StopButton.Size = new System.Drawing.Size(31, 23);
this.StopButton.TabIndex = 10;
this.StopButton.Text = "◼";
this.StopButton.UseVisualStyleBackColor = true;
//
// VolumeLabel // VolumeLabel
// //
this.VolumeLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.VolumeLabel.AutoSize = true; this.VolumeLabel.AutoSize = true;
this.VolumeLabel.Location = new System.Drawing.Point(414, 305); this.VolumeLabel.Location = new System.Drawing.Point(405, 308);
this.VolumeLabel.Name = "VolumeLabel"; this.VolumeLabel.Name = "VolumeLabel";
this.VolumeLabel.Size = new System.Drawing.Size(42, 13); this.VolumeLabel.Size = new System.Drawing.Size(60, 13);
this.VolumeLabel.TabIndex = 9; this.VolumeLabel.TabIndex = 9;
this.VolumeLabel.Text = "Volume"; this.VolumeLabel.Text = "🕩 Volume";
// //
// chbAutoJump // chbAutoJump
// //
this.chbAutoJump.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
this.chbAutoJump.AutoSize = true; this.chbAutoJump.AutoSize = true;
this.chbAutoJump.Enabled = false; this.chbAutoJump.Location = new System.Drawing.Point(17, 308);
this.chbAutoJump.Location = new System.Drawing.Point(17, 305);
this.chbAutoJump.Name = "chbAutoJump"; this.chbAutoJump.Name = "chbAutoJump";
this.chbAutoJump.Size = new System.Drawing.Size(108, 17); this.chbAutoJump.Size = new System.Drawing.Size(108, 17);
this.chbAutoJump.TabIndex = 8; this.chbAutoJump.TabIndex = 8;
@ -104,34 +144,34 @@
// //
// PrevButton // PrevButton
// //
this.PrevButton.Anchor = System.Windows.Forms.AnchorStyles.Bottom; this.PrevButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.PrevButton.Location = new System.Drawing.Point(137, 301); this.PrevButton.Location = new System.Drawing.Point(137, 304);
this.PrevButton.Name = "PrevButton"; this.PrevButton.Name = "PrevButton";
this.PrevButton.Size = new System.Drawing.Size(31, 23); this.PrevButton.Size = new System.Drawing.Size(31, 23);
this.PrevButton.TabIndex = 2; this.PrevButton.TabIndex = 2;
this.PrevButton.Text = "<<"; this.PrevButton.Text = "";
this.PrevButton.UseVisualStyleBackColor = true; this.PrevButton.UseVisualStyleBackColor = true;
this.PrevButton.Click += new System.EventHandler(this.PrevButton_Click); this.PrevButton.Click += new System.EventHandler(this.PrevButton_Click);
// //
// NextButton // NextButton
// //
this.NextButton.Anchor = System.Windows.Forms.AnchorStyles.Bottom; this.NextButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.NextButton.Location = new System.Drawing.Point(255, 301); this.NextButton.Location = new System.Drawing.Point(248, 304);
this.NextButton.Name = "NextButton"; this.NextButton.Name = "NextButton";
this.NextButton.Size = new System.Drawing.Size(31, 23); this.NextButton.Size = new System.Drawing.Size(31, 23);
this.NextButton.TabIndex = 4; this.NextButton.TabIndex = 4;
this.NextButton.Text = ">>"; this.NextButton.Text = "";
this.NextButton.UseVisualStyleBackColor = true; this.NextButton.UseVisualStyleBackColor = true;
this.NextButton.Click += new System.EventHandler(this.NextButton_Click); this.NextButton.Click += new System.EventHandler(this.NextButton_Click);
// //
// PlayButton // PlayButton
// //
this.PlayButton.Anchor = System.Windows.Forms.AnchorStyles.Bottom; this.PlayButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.PlayButton.Location = new System.Drawing.Point(174, 301); this.PlayButton.Location = new System.Drawing.Point(174, 304);
this.PlayButton.Name = "PlayButton"; this.PlayButton.Name = "PlayButton";
this.PlayButton.Size = new System.Drawing.Size(75, 23); this.PlayButton.Size = new System.Drawing.Size(31, 23);
this.PlayButton.TabIndex = 3; this.PlayButton.TabIndex = 3;
this.PlayButton.Text = "Play/Pause"; this.PlayButton.Text = "";
this.PlayButton.UseVisualStyleBackColor = true; this.PlayButton.UseVisualStyleBackColor = true;
this.PlayButton.Click += new System.EventHandler(this.PlayButton_Click); this.PlayButton.Click += new System.EventHandler(this.PlayButton_Click);
// //
@ -143,13 +183,15 @@
this.PlayListView.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { this.PlayListView.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
this.PlaylistNameHeader, this.PlaylistNameHeader,
this.PlaylistTypeHeader, this.PlaylistTypeHeader,
this.PlaylistLengthHeader}); this.PlaylistLengthHeader,
this.PlaylistSizeHeader});
this.PlayListView.ContextMenuStrip = this.contextMenuStrip;
this.PlayListView.FullRowSelect = true; this.PlayListView.FullRowSelect = true;
this.PlayListView.HideSelection = false; this.PlayListView.HideSelection = false;
this.PlayListView.Location = new System.Drawing.Point(6, 6); this.PlayListView.Location = new System.Drawing.Point(6, 6);
this.PlayListView.MultiSelect = false; this.PlayListView.MultiSelect = false;
this.PlayListView.Name = "PlayListView"; this.PlayListView.Name = "PlayListView";
this.PlayListView.Size = new System.Drawing.Size(556, 235); this.PlayListView.Size = new System.Drawing.Size(556, 238);
this.PlayListView.TabIndex = 0; this.PlayListView.TabIndex = 0;
this.PlayListView.UseCompatibleStateImageBehavior = false; this.PlayListView.UseCompatibleStateImageBehavior = false;
this.PlayListView.View = System.Windows.Forms.View.Details; this.PlayListView.View = System.Windows.Forms.View.Details;
@ -158,7 +200,7 @@
// PlaylistNameHeader // PlaylistNameHeader
// //
this.PlaylistNameHeader.Text = "Name"; this.PlaylistNameHeader.Text = "Name";
this.PlaylistNameHeader.Width = 303; this.PlaylistNameHeader.Width = 260;
// //
// PlaylistTypeHeader // PlaylistTypeHeader
// //
@ -168,14 +210,29 @@
// PlaylistLengthHeader // PlaylistLengthHeader
// //
this.PlaylistLengthHeader.Text = "Length"; this.PlaylistLengthHeader.Text = "Length";
this.PlaylistLengthHeader.Width = 110; this.PlaylistLengthHeader.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;
this.PlaylistLengthHeader.Width = 80;
//
// contextMenuStrip
//
this.contextMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.ExportAsWav});
this.contextMenuStrip.Name = "contextMenuStrip1";
this.contextMenuStrip.Size = new System.Drawing.Size(153, 48);
//
// ExportAsWav
//
this.ExportAsWav.Name = "ExportAsWav";
this.ExportAsWav.Size = new System.Drawing.Size(152, 22);
this.ExportAsWav.Text = "Export as .wav";
this.ExportAsWav.Click += new System.EventHandler(this.ExportAsWav_Click);
// //
// VolumeTrackBar // VolumeTrackBar
// //
this.VolumeTrackBar.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); this.VolumeTrackBar.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.VolumeTrackBar.BackColor = System.Drawing.SystemColors.ControlLightLight; this.VolumeTrackBar.BackColor = System.Drawing.SystemColors.ControlLightLight;
this.VolumeTrackBar.LargeChange = 10; this.VolumeTrackBar.LargeChange = 10;
this.VolumeTrackBar.Location = new System.Drawing.Point(455, 301); this.VolumeTrackBar.Location = new System.Drawing.Point(455, 304);
this.VolumeTrackBar.Maximum = 100; this.VolumeTrackBar.Maximum = 100;
this.VolumeTrackBar.Name = "VolumeTrackBar"; this.VolumeTrackBar.Name = "VolumeTrackBar";
this.VolumeTrackBar.Size = new System.Drawing.Size(105, 45); this.VolumeTrackBar.Size = new System.Drawing.Size(105, 45);
@ -190,7 +247,7 @@
| System.Windows.Forms.AnchorStyles.Right))); | System.Windows.Forms.AnchorStyles.Right)));
this.PositionTrackBar.BackColor = System.Drawing.SystemColors.ControlLightLight; this.PositionTrackBar.BackColor = System.Drawing.SystemColors.ControlLightLight;
this.PositionTrackBar.LargeChange = 1000; this.PositionTrackBar.LargeChange = 1000;
this.PositionTrackBar.Location = new System.Drawing.Point(6, 263); this.PositionTrackBar.Location = new System.Drawing.Point(6, 266);
this.PositionTrackBar.Maximum = 1000; this.PositionTrackBar.Maximum = 1000;
this.PositionTrackBar.Name = "PositionTrackBar"; this.PositionTrackBar.Name = "PositionTrackBar";
this.PositionTrackBar.Size = new System.Drawing.Size(554, 45); this.PositionTrackBar.Size = new System.Drawing.Size(554, 45);
@ -204,7 +261,7 @@
this.DetailsTabPage.Location = new System.Drawing.Point(4, 22); this.DetailsTabPage.Location = new System.Drawing.Point(4, 22);
this.DetailsTabPage.Name = "DetailsTabPage"; this.DetailsTabPage.Name = "DetailsTabPage";
this.DetailsTabPage.Padding = new System.Windows.Forms.Padding(3); this.DetailsTabPage.Padding = new System.Windows.Forms.Padding(3);
this.DetailsTabPage.Size = new System.Drawing.Size(568, 332); this.DetailsTabPage.Size = new System.Drawing.Size(568, 335);
this.DetailsTabPage.TabIndex = 1; this.DetailsTabPage.TabIndex = 1;
this.DetailsTabPage.Text = "Details"; this.DetailsTabPage.Text = "Details";
this.DetailsTabPage.UseVisualStyleBackColor = true; this.DetailsTabPage.UseVisualStyleBackColor = true;
@ -215,27 +272,41 @@
this.DetailsPropertyGrid.HelpVisible = false; this.DetailsPropertyGrid.HelpVisible = false;
this.DetailsPropertyGrid.Location = new System.Drawing.Point(3, 3); this.DetailsPropertyGrid.Location = new System.Drawing.Point(3, 3);
this.DetailsPropertyGrid.Name = "DetailsPropertyGrid"; this.DetailsPropertyGrid.Name = "DetailsPropertyGrid";
this.DetailsPropertyGrid.Size = new System.Drawing.Size(562, 326); this.DetailsPropertyGrid.Size = new System.Drawing.Size(562, 329);
this.DetailsPropertyGrid.TabIndex = 0; this.DetailsPropertyGrid.TabIndex = 0;
// //
// Timer // Timer
// //
this.Timer.Enabled = true; this.Timer.Enabled = true;
this.Timer.Interval = 25;
this.Timer.Tick += new System.EventHandler(this.Timer_Tick); this.Timer.Tick += new System.EventHandler(this.Timer_Tick);
// //
// saveFileDialog
//
this.saveFileDialog.DefaultExt = "wav";
this.saveFileDialog.Filter = "Wave files (*.wav)|*.wav";
//
// PlaylistSizeHeader
//
this.PlaylistSizeHeader.Text = "Size";
this.PlaylistSizeHeader.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;
this.PlaylistSizeHeader.Width = 80;
//
// AwcForm // AwcForm
// //
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(576, 358); this.ClientSize = new System.Drawing.Size(576, 361);
this.Controls.Add(this.MainTabControl); this.Controls.Add(this.MainTabControl);
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.MinimumSize = new System.Drawing.Size(592, 300);
this.Name = "AwcForm"; this.Name = "AwcForm";
this.Text = "AWC Player - CodeWalker by dexyfex"; this.Text = "AWC Player - CodeWalker by dexyfex";
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.AwcForm_FormClosing); this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.AwcForm_FormClosing);
this.MainTabControl.ResumeLayout(false); this.MainTabControl.ResumeLayout(false);
this.PlayerTabPage.ResumeLayout(false); this.PlayerTabPage.ResumeLayout(false);
this.PlayerTabPage.PerformLayout(); this.PlayerTabPage.PerformLayout();
this.contextMenuStrip.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)(this.VolumeTrackBar)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.VolumeTrackBar)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.PositionTrackBar)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.PositionTrackBar)).EndInit();
this.DetailsTabPage.ResumeLayout(false); this.DetailsTabPage.ResumeLayout(false);
@ -261,5 +332,12 @@
private System.Windows.Forms.Timer Timer; private System.Windows.Forms.Timer Timer;
private System.Windows.Forms.CheckBox chbAutoJump; private System.Windows.Forms.CheckBox chbAutoJump;
private System.Windows.Forms.Label VolumeLabel; private System.Windows.Forms.Label VolumeLabel;
private System.Windows.Forms.Button StopButton;
private System.Windows.Forms.Label LabelTime;
private System.Windows.Forms.Label LabelInfo;
private System.Windows.Forms.ContextMenuStrip contextMenuStrip;
private System.Windows.Forms.ToolStripMenuItem ExportAsWav;
private System.Windows.Forms.SaveFileDialog saveFileDialog;
private System.Windows.Forms.ColumnHeader PlaylistSizeHeader;
} }
} }

View File

@ -1,78 +1,86 @@
using CodeWalker.GameFiles; using CodeWalker.GameFiles;
using SharpDX.Multimedia; using SharpDX.Multimedia;
using SharpDX.XAudio2; using SharpDX.XAudio2;
using System; using System;
using System.IO; using System.IO;
using System.Diagnostics; using System.Diagnostics;
using System.Windows.Forms; using System.Windows.Forms;
namespace CodeWalker.Forms namespace CodeWalker.Forms
{ {
public partial class AwcForm : Form public partial class AwcForm : Form
{ {
public AwcFile Awc { get; set; } public AwcFile Awc { get; set; }
private AwcAudio currentAudio;
private XAudio2 xAudio2; private XAudio2 xAudio2;
private MasteringVoice masteringVoice; private MasteringVoice masteringVoice;
private AudioBuffer audioBuffer; private AudioBuffer audioBuffer;
private SourceVoice sourceVoice; private SourceVoice sourceVoice;
private string fileName;
public string FileName
{
get { return fileName; }
set
{
fileName = value;
UpdateFormTitle();
}
}
public string FilePath { get; set; }
private enum PlayerState { Stopped, Playing, Paused };
private PlayerState playerState = PlayerState.Stopped;
private Stopwatch playtime;
private int playBeginMs;
private float trackLength;
private bool trackFinished;
public AwcForm()
{
InitializeComponent();
playtime = new Stopwatch();
}
private void UpdateFormTitle()
{
Text = fileName + " - AWC Player - CodeWalker by dexyfex";
}
public void LoadAwc(AwcFile awc)
{
Awc = awc;
DetailsPropertyGrid.SelectedObject = awc;
fileName = awc?.Name;
if (string.IsNullOrEmpty(fileName))
{
fileName = awc?.FileEntry?.Name;
}
PlayListView.Items.Clear();
float totalLength = 0;
if (awc.Audios != null)
{
foreach (var audio in awc.Audios)
{
var item = PlayListView.Items.Add(audio.Name);
item.SubItems.Add(audio.Type);
item.SubItems.Add(audio.LengthStr);
item.SubItems.Add(TextUtil.GetBytesReadable(audio.Data.Length));
item.Tag = audio;
totalLength += audio.Length;
}
}
LabelInfo.Text = awc.Audios.Length.ToString() + " track(s), Length: " + TimeSpan.FromSeconds((float)totalLength).ToString("m\\:ss");
UpdateFormTitle();
}
private string fileName;
public string FileName
{
get { return fileName; }
set
{
fileName = value;
UpdateFormTitle();
}
}
public string FilePath { get; set; }
private enum PlayerState { Stopped, Playing, Paused };
private PlayerState playerState = PlayerState.Stopped;
private Stopwatch playtime;
private float trackLength;
public AwcForm()
{
InitializeComponent();
playtime = new Stopwatch();
}
private void UpdateFormTitle()
{
Text = fileName + " - AWC Player - CodeWalker by dexyfex";
}
public void LoadAwc(AwcFile awc)
{
Awc = awc;
DetailsPropertyGrid.SelectedObject = awc;
fileName = awc?.Name;
if (string.IsNullOrEmpty(fileName))
{
fileName = awc?.FileEntry?.Name;
}
PlayListView.Items.Clear();
if (awc.Audios != null)
{
foreach (var audio in awc.Audios)
{
var item = PlayListView.Items.Add(audio.Name);
item.SubItems.Add(audio.Type);
item.SubItems.Add(audio.LengthStr);
item.Tag = audio;
}
}
UpdateFormTitle();
}
private void Stop() private void Stop()
{ {
if (playerState != PlayerState.Stopped) if (playerState != PlayerState.Stopped)
@ -82,8 +90,8 @@ namespace CodeWalker.Forms
audioBuffer.Stream.Dispose(); audioBuffer.Stream.Dispose();
SetPlayerState(PlayerState.Stopped); SetPlayerState(PlayerState.Stopped);
} }
} }
private void SetPlayerState(PlayerState newState) private void SetPlayerState(PlayerState newState)
{ {
if (playerState != newState) if (playerState != newState)
@ -94,60 +102,88 @@ namespace CodeWalker.Forms
if (playerState == PlayerState.Stopped) if (playerState == PlayerState.Stopped)
playtime.Reset(); playtime.Reset();
playtime.Start(); playtime.Start();
PlayButton.Text = "\u275A\u275A";
StopButton.Enabled = true;
LabelTime.Visible = true;
break; break;
default: case PlayerState.Paused:
playtime.Stop(); playtime.Stop();
PlayButton.Text = "\u25B6";
StopButton.Enabled = true;
LabelTime.Visible = true;
break;
case PlayerState.Stopped:
playtime.Stop();
PlayButton.Text = "\u25B6";
LabelTime.Visible = false;
StopButton.Enabled = true;
break; break;
} }
playerState = newState; playerState = newState;
UpdateUI();
} }
} }
private void InitializeAudio(AwcAudio audio) private void InitializeAudio(AwcAudio audio, float playBegin = 0)
{ {
currentAudio = audio;
trackLength = audio.Length; trackLength = audio.Length;
if (xAudio2 == null) if (xAudio2 == null)
{ {
xAudio2 = new XAudio2(); xAudio2 = new XAudio2();
masteringVoice = new MasteringVoice(xAudio2); masteringVoice = new MasteringVoice(xAudio2);
} }
Stream wavStream = audio.GetWavStream(); Stream wavStream = audio.GetWavStream();
SoundStream soundStream = new SoundStream(wavStream); SoundStream soundStream = new SoundStream(wavStream);
audioBuffer = new AudioBuffer audioBuffer = new AudioBuffer
{ {
Stream = soundStream.ToDataStream(), Stream = soundStream.ToDataStream(),
AudioBytes = (int)soundStream.Length, AudioBytes = (int)soundStream.Length,
Flags = BufferFlags.EndOfStream Flags = BufferFlags.EndOfStream
}; };
if (playBegin > 0)
{
audioBuffer.PlayBegin = (int)(soundStream.Format.SampleRate * playBegin) / 128 * 128;
if (playtime.IsRunning)
playtime.Restart();
else
playtime.Reset();
playBeginMs = (int)(playBegin * 1000);
}
else
playBeginMs = 0;
soundStream.Close(); soundStream.Close();
wavStream.Close(); wavStream.Close();
sourceVoice = new SourceVoice(xAudio2, soundStream.Format, true); trackFinished = false;
sourceVoice = new SourceVoice(xAudio2, soundStream.Format, true);
sourceVoice.SubmitSourceBuffer(audioBuffer, soundStream.DecodedPacketsInfo); sourceVoice.SubmitSourceBuffer(audioBuffer, soundStream.DecodedPacketsInfo);
sourceVoice.SetVolume((float)VolumeTrackBar.Value / 100); sourceVoice.BufferEnd += (context) => trackFinished = true;
} sourceVoice.SetVolume((float)VolumeTrackBar.Value / 100);
}
private void Play()
{ private void Play()
Stop(); {
Stop();
if (PlayListView.SelectedItems.Count == 1) if (PlayListView.SelectedItems.Count == 1)
{ {
var item = PlayListView.SelectedItems[0]; var item = PlayListView.SelectedItems[0];
var audio = item.Tag as AwcAudio; var audio = item.Tag as AwcAudio;
if (audio != null) if (audio != null)
{ {
InitializeAudio(audio); InitializeAudio(audio);
sourceVoice.Start(); sourceVoice.Start();
SetPlayerState(PlayerState.Playing); SetPlayerState(PlayerState.Playing);
} }
} }
} }
private void PlayPrevious() private void PlayPrevious()
{ {
Stop(); Stop();
@ -161,8 +197,8 @@ namespace CodeWalker.Forms
Play(); Play();
} }
} }
} }
private void PlayNext() private void PlayNext()
{ {
Stop(); Stop();
@ -176,33 +212,36 @@ namespace CodeWalker.Forms
Play(); Play();
} }
} }
} }
private void Pause() private void Pause()
{ {
if (playerState == PlayerState.Playing) if (playerState == PlayerState.Playing)
{ {
sourceVoice.Stop(); sourceVoice.Stop();
SetPlayerState(PlayerState.Paused); SetPlayerState(PlayerState.Paused);
} }
} }
private void Resume() private void Resume()
{ {
if (playerState == PlayerState.Paused) if (playerState == PlayerState.Paused)
{ {
sourceVoice.Start(); sourceVoice.Start();
SetPlayerState(PlayerState.Playing); SetPlayerState(PlayerState.Playing);
} }
} }
private void PositionTrackBar_Scroll(object sender, EventArgs e) private void PositionTrackBar_Scroll(object sender, EventArgs e)
{ {
} sourceVoice.Stop();
InitializeAudio(currentAudio, PositionTrackBar.Value / 1000);
private void PlayButton_Click(object sender, EventArgs e) sourceVoice.Start();
{ }
private void PlayButton_Click(object sender, EventArgs e)
{
switch (playerState) switch (playerState)
{ {
case PlayerState.Stopped: case PlayerState.Stopped:
@ -214,33 +253,44 @@ namespace CodeWalker.Forms
case PlayerState.Paused: case PlayerState.Paused:
Resume(); Resume();
break; break;
} }
}
private void PrevButton_Click(object sender, EventArgs e)
{
PlayPrevious();
}
private void NextButton_Click(object sender, EventArgs e)
{
PlayNext();
}
private void VolumeTrackBar_Scroll(object sender, EventArgs e)
{
if (playerState == PlayerState.Playing)
sourceVoice.SetVolume((float)VolumeTrackBar.Value / 100);
} }
private void Timer_Tick(object sender, EventArgs e) private void PrevButton_Click(object sender, EventArgs e)
{ {
PlayPrevious();
}
private void NextButton_Click(object sender, EventArgs e)
{
PlayNext();
}
private void VolumeTrackBar_Scroll(object sender, EventArgs e)
{
if (playerState == PlayerState.Playing)
sourceVoice.SetVolume((float)VolumeTrackBar.Value / 100);
}
private void UpdateUI()
{
if (playerState != PlayerState.Stopped && trackFinished)
{
if (chbAutoJump.Checked)
PlayNext();
else
Stop();
}
if (playerState != PlayerState.Stopped) if (playerState != PlayerState.Stopped)
{ {
int playedMs = (int)playtime.Elapsed.TotalMilliseconds; int playedMs = (int)playtime.Elapsed.TotalMilliseconds + playBeginMs;
int totalMs = (int)(trackLength * 1000); int totalMs = (int)(trackLength * 1000);
PositionTrackBar.Maximum = totalMs; PositionTrackBar.Maximum = totalMs;
PositionTrackBar.Value = playedMs < totalMs ? playedMs : totalMs; PositionTrackBar.Value = playedMs < totalMs ? playedMs : totalMs;
LabelTime.Text = TimeSpan.FromSeconds(playedMs / 1000).ToString("m\\:ss")
+ " / " + TimeSpan.FromSeconds(totalMs / 1000).ToString("m\\:ss");
} }
else else
{ {
@ -248,6 +298,11 @@ namespace CodeWalker.Forms
} }
} }
private void Timer_Tick(object sender, EventArgs e)
{
UpdateUI();
}
private void PlayListView_DoubleClick(object sender, EventArgs e) private void PlayListView_DoubleClick(object sender, EventArgs e)
{ {
if (playerState == PlayerState.Playing) if (playerState == PlayerState.Playing)
@ -263,6 +318,25 @@ namespace CodeWalker.Forms
masteringVoice.Dispose(); masteringVoice.Dispose();
xAudio2.Dispose(); xAudio2.Dispose();
} }
} }
}
} private void ExportAsWav_Click(object sender, EventArgs e)
{
if (PlayListView.SelectedItems.Count == 1)
{
var item = PlayListView.SelectedItems[0];
var audio = item.Tag as AwcAudio;
saveFileDialog.FileName = audio.Name + ".wav";
if (saveFileDialog.ShowDialog() == DialogResult.OK)
{
Stream wavStream = audio.GetWavStream();
FileStream stream = File.Create(saveFileDialog.FileName);
wavStream.CopyTo(stream);
stream.Close();
wavStream.Close();
}
}
}
}
}

View File

@ -117,9 +117,15 @@
<resheader name="writer"> <resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader> </resheader>
<metadata name="contextMenuStrip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>99, 17</value>
</metadata>
<metadata name="Timer.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> <metadata name="Timer.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value> <value>17, 17</value>
</metadata> </metadata>
<metadata name="saveFileDialog.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>254, 17</value>
</metadata>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" /> <assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value> <value>

File diff suppressed because it is too large Load Diff