bug fixes
@@ -84,6 +84,18 @@
|
|||||||
<Compile Include="frmCUEPlayer.Designer.cs">
|
<Compile Include="frmCUEPlayer.Designer.cs">
|
||||||
<DependentUpon>frmCUEPlayer.cs</DependentUpon>
|
<DependentUpon>frmCUEPlayer.cs</DependentUpon>
|
||||||
</Compile>
|
</Compile>
|
||||||
|
<Compile Include="Icecast.cs">
|
||||||
|
<SubType>Form</SubType>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="Icecast.Designer.cs">
|
||||||
|
<DependentUpon>Icecast.cs</DependentUpon>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="IcecastSettings.cs">
|
||||||
|
<SubType>Form</SubType>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="IcecastSettings.Designer.cs">
|
||||||
|
<DependentUpon>IcecastSettings.cs</DependentUpon>
|
||||||
|
</Compile>
|
||||||
<Compile Include="Output.cs">
|
<Compile Include="Output.cs">
|
||||||
<SubType>Form</SubType>
|
<SubType>Form</SubType>
|
||||||
</Compile>
|
</Compile>
|
||||||
@@ -107,6 +119,12 @@
|
|||||||
<EmbeddedResource Include="frmCUEPlayer.resx">
|
<EmbeddedResource Include="frmCUEPlayer.resx">
|
||||||
<DependentUpon>frmCUEPlayer.cs</DependentUpon>
|
<DependentUpon>frmCUEPlayer.cs</DependentUpon>
|
||||||
</EmbeddedResource>
|
</EmbeddedResource>
|
||||||
|
<EmbeddedResource Include="Icecast.resx">
|
||||||
|
<DependentUpon>Icecast.cs</DependentUpon>
|
||||||
|
</EmbeddedResource>
|
||||||
|
<EmbeddedResource Include="IcecastSettings.resx">
|
||||||
|
<DependentUpon>IcecastSettings.cs</DependentUpon>
|
||||||
|
</EmbeddedResource>
|
||||||
<EmbeddedResource Include="Output.resx">
|
<EmbeddedResource Include="Output.resx">
|
||||||
<DependentUpon>Output.cs</DependentUpon>
|
<DependentUpon>Output.cs</DependentUpon>
|
||||||
</EmbeddedResource>
|
</EmbeddedResource>
|
||||||
@@ -132,6 +150,7 @@
|
|||||||
<DependentUpon>Settings.settings</DependentUpon>
|
<DependentUpon>Settings.settings</DependentUpon>
|
||||||
<DesignTimeSharedInput>True</DesignTimeSharedInput>
|
<DesignTimeSharedInput>True</DesignTimeSharedInput>
|
||||||
</Compile>
|
</Compile>
|
||||||
|
<Compile Include="Settings.cs" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ProjectReference Include="..\CUEControls\CUEControls.csproj">
|
<ProjectReference Include="..\CUEControls\CUEControls.csproj">
|
||||||
@@ -146,6 +165,10 @@
|
|||||||
<Project>{FAD09EE2-D6B2-4A8E-9F1C-2A9FB293661A}</Project>
|
<Project>{FAD09EE2-D6B2-4A8E-9F1C-2A9FB293661A}</Project>
|
||||||
<Name>CUETools.Codecs.CoreAudio</Name>
|
<Name>CUETools.Codecs.CoreAudio</Name>
|
||||||
</ProjectReference>
|
</ProjectReference>
|
||||||
|
<ProjectReference Include="..\CUETools.Codecs.Icecast\CUETools.Codecs.Icecast.csproj">
|
||||||
|
<Project>{8FC5DA7C-F6AC-4D04-85BC-1233DDF569E7}</Project>
|
||||||
|
<Name>CUETools.Codecs.Icecast</Name>
|
||||||
|
</ProjectReference>
|
||||||
<ProjectReference Include="..\CUETools.Codecs\CUETools.Codecs.csproj">
|
<ProjectReference Include="..\CUETools.Codecs\CUETools.Codecs.csproj">
|
||||||
<Project>{6458A13A-30EF-45A9-9D58-E5031B17BEE2}</Project>
|
<Project>{6458A13A-30EF-45A9-9D58-E5031B17BEE2}</Project>
|
||||||
<Name>CUETools.Codecs</Name>
|
<Name>CUETools.Codecs</Name>
|
||||||
@@ -248,6 +271,13 @@
|
|||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Content Include="CUEPlayer.sdf">
|
<Content Include="CUEPlayer.sdf">
|
||||||
</Content>
|
</Content>
|
||||||
|
<None Include="Properties\DataSources\CUETools.Codecs.Icecast.IcecastSettingsData.datasource" />
|
||||||
|
<None Include="Resources\transmit.ico" />
|
||||||
|
<None Include="Resources\cog.png" />
|
||||||
|
<None Include="Properties\DataSources\Output.datasource" />
|
||||||
|
<None Include="Resources\sound_mute.png" />
|
||||||
|
<None Include="Resources\sound.png" />
|
||||||
|
<None Include="Resources\transmit_blue.png" />
|
||||||
<None Include="Resources\ctdb.png" />
|
<None Include="Resources\ctdb.png" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||||
|
|||||||
32
CUEPlayer/DataSet1.Designer.cs
generated
@@ -458,10 +458,10 @@ namespace CUEPlayer {
|
|||||||
this.columnid.ReadOnly = true;
|
this.columnid.ReadOnly = true;
|
||||||
this.columnid.Unique = true;
|
this.columnid.Unique = true;
|
||||||
this.columnpath.AllowDBNull = false;
|
this.columnpath.AllowDBNull = false;
|
||||||
this.columnpath.MaxLength = 100;
|
this.columnpath.MaxLength = 255;
|
||||||
this.columnartist.MaxLength = 100;
|
this.columnartist.MaxLength = 255;
|
||||||
this.columntitle.MaxLength = 100;
|
this.columntitle.MaxLength = 255;
|
||||||
this.columnalbum.MaxLength = 100;
|
this.columnalbum.MaxLength = 255;
|
||||||
}
|
}
|
||||||
|
|
||||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||||
@@ -616,11 +616,11 @@ namespace CUEPlayer {
|
|||||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||||
public string artist {
|
public string artist {
|
||||||
get {
|
get {
|
||||||
try {
|
if (this.IsartistNull()) {
|
||||||
return ((string)(this[this.tablePlaylist.artistColumn]));
|
return string.Empty;
|
||||||
}
|
}
|
||||||
catch (global::System.InvalidCastException e) {
|
else {
|
||||||
throw new global::System.Data.StrongTypingException("The value for column \'artist\' in table \'Playlist\' is DBNull.", e);
|
return ((string)(this[this.tablePlaylist.artistColumn]));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
set {
|
set {
|
||||||
@@ -631,11 +631,11 @@ namespace CUEPlayer {
|
|||||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||||
public string title {
|
public string title {
|
||||||
get {
|
get {
|
||||||
try {
|
if (this.IstitleNull()) {
|
||||||
return ((string)(this[this.tablePlaylist.titleColumn]));
|
return string.Empty;
|
||||||
}
|
}
|
||||||
catch (global::System.InvalidCastException e) {
|
else {
|
||||||
throw new global::System.Data.StrongTypingException("The value for column \'title\' in table \'Playlist\' is DBNull.", e);
|
return ((string)(this[this.tablePlaylist.titleColumn]));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
set {
|
set {
|
||||||
@@ -646,11 +646,11 @@ namespace CUEPlayer {
|
|||||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||||
public string album {
|
public string album {
|
||||||
get {
|
get {
|
||||||
try {
|
if (this.IsalbumNull()) {
|
||||||
return ((string)(this[this.tablePlaylist.albumColumn]));
|
return string.Empty;
|
||||||
}
|
}
|
||||||
catch (global::System.InvalidCastException e) {
|
else {
|
||||||
throw new global::System.Data.StrongTypingException("The value for column \'album\' in table \'Playlist\' is DBNull.", e);
|
return ((string)(this[this.tablePlaylist.albumColumn]));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
set {
|
set {
|
||||||
|
|||||||
@@ -32,7 +32,7 @@
|
|||||||
</DbCommand>
|
</DbCommand>
|
||||||
</InsertCommand>
|
</InsertCommand>
|
||||||
<SelectCommand>
|
<SelectCommand>
|
||||||
<DbCommand CommandType="Text" ModifiedByUser="false">
|
<DbCommand CommandType="Text" ModifiedByUser="true">
|
||||||
<CommandText>SELECT [id], [path], [artist], [title], [album], [length], [track] FROM [Playlist]</CommandText>
|
<CommandText>SELECT [id], [path], [artist], [title], [album], [length], [track] FROM [Playlist]</CommandText>
|
||||||
<Parameters />
|
<Parameters />
|
||||||
</DbCommand>
|
</DbCommand>
|
||||||
@@ -69,43 +69,43 @@
|
|||||||
</DataSource>
|
</DataSource>
|
||||||
</xs:appinfo>
|
</xs:appinfo>
|
||||||
</xs:annotation>
|
</xs:annotation>
|
||||||
<xs:element name="DataSet1" msdata:IsDataSet="true" msdata:UseCurrentLocale="true" msprop:Generator_DataSetName="DataSet1" msprop:Generator_UserDSName="DataSet1" msprop:EnableTableAdapterManager="true">
|
<xs:element name="DataSet1" msdata:IsDataSet="true" msdata:UseCurrentLocale="true" msprop:Generator_UserDSName="DataSet1" msprop:Generator_DataSetName="DataSet1" msprop:EnableTableAdapterManager="true">
|
||||||
<xs:complexType>
|
<xs:complexType>
|
||||||
<xs:choice minOccurs="0" maxOccurs="unbounded">
|
<xs:choice minOccurs="0" maxOccurs="unbounded">
|
||||||
<xs:element name="Playlist" msprop:Generator_UserTableName="Playlist" msprop:Generator_RowDeletedName="PlaylistRowDeleted" msprop:Generator_TableClassName="PlaylistDataTable" msprop:Generator_RowChangedName="PlaylistRowChanged" msprop:Generator_RowClassName="PlaylistRow" msprop:Generator_RowChangingName="PlaylistRowChanging" msprop:Generator_RowEvArgName="PlaylistRowChangeEvent" msprop:Generator_RowEvHandlerName="PlaylistRowChangeEventHandler" msprop:Generator_TablePropName="Playlist" msprop:Generator_TableVarName="tablePlaylist" msprop:Generator_RowDeletingName="PlaylistRowDeleting">
|
<xs:element name="Playlist" msprop:Generator_UserTableName="Playlist" msprop:Generator_RowDeletedName="PlaylistRowDeleted" msprop:Generator_RowChangedName="PlaylistRowChanged" msprop:Generator_RowClassName="PlaylistRow" msprop:Generator_RowChangingName="PlaylistRowChanging" msprop:Generator_RowEvArgName="PlaylistRowChangeEvent" msprop:Generator_RowEvHandlerName="PlaylistRowChangeEventHandler" msprop:Generator_TableClassName="PlaylistDataTable" msprop:Generator_TableVarName="tablePlaylist" msprop:Generator_RowDeletingName="PlaylistRowDeleting" msprop:Generator_TablePropName="Playlist">
|
||||||
<xs:complexType>
|
<xs:complexType>
|
||||||
<xs:sequence>
|
<xs:sequence>
|
||||||
<xs:element name="id" msdata:ReadOnly="true" msdata:AutoIncrement="true" msdata:AutoIncrementSeed="-1" msdata:AutoIncrementStep="-1" msprop:Generator_UserColumnName="id" msprop:Generator_ColumnPropNameInRow="id" msprop:Generator_ColumnVarNameInTable="columnid" msprop:Generator_ColumnPropNameInTable="idColumn" type="xs:int" />
|
<xs:element name="id" msdata:ReadOnly="true" msdata:AutoIncrement="true" msdata:AutoIncrementSeed="-1" msdata:AutoIncrementStep="-1" msprop:Generator_UserColumnName="id" msprop:Generator_ColumnVarNameInTable="columnid" msprop:Generator_ColumnPropNameInRow="id" msprop:Generator_ColumnPropNameInTable="idColumn" type="xs:int" />
|
||||||
<xs:element name="path" msprop:Generator_UserColumnName="path" msprop:Generator_ColumnPropNameInRow="path" msprop:Generator_ColumnVarNameInTable="columnpath" msprop:Generator_ColumnPropNameInTable="pathColumn">
|
<xs:element name="path" msprop:Generator_UserColumnName="path" msprop:Generator_ColumnVarNameInTable="columnpath" msprop:Generator_ColumnPropNameInRow="path" msprop:Generator_ColumnPropNameInTable="pathColumn">
|
||||||
<xs:simpleType>
|
<xs:simpleType>
|
||||||
<xs:restriction base="xs:string">
|
<xs:restriction base="xs:string">
|
||||||
<xs:maxLength value="100" />
|
<xs:maxLength value="255" />
|
||||||
</xs:restriction>
|
</xs:restriction>
|
||||||
</xs:simpleType>
|
</xs:simpleType>
|
||||||
</xs:element>
|
</xs:element>
|
||||||
<xs:element name="artist" msprop:Generator_UserColumnName="artist" msprop:Generator_ColumnPropNameInRow="artist" msprop:Generator_ColumnVarNameInTable="columnartist" msprop:Generator_ColumnPropNameInTable="artistColumn" minOccurs="0">
|
<xs:element name="artist" msprop:Generator_UserColumnName="artist" msprop:Generator_ColumnVarNameInTable="columnartist" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="artist" msprop:Generator_ColumnPropNameInTable="artistColumn" minOccurs="0">
|
||||||
<xs:simpleType>
|
<xs:simpleType>
|
||||||
<xs:restriction base="xs:string">
|
<xs:restriction base="xs:string">
|
||||||
<xs:maxLength value="100" />
|
<xs:maxLength value="255" />
|
||||||
</xs:restriction>
|
</xs:restriction>
|
||||||
</xs:simpleType>
|
</xs:simpleType>
|
||||||
</xs:element>
|
</xs:element>
|
||||||
<xs:element name="title" msprop:Generator_UserColumnName="title" msprop:Generator_ColumnPropNameInRow="title" msprop:Generator_ColumnVarNameInTable="columntitle" msprop:Generator_ColumnPropNameInTable="titleColumn" minOccurs="0">
|
<xs:element name="title" msprop:Generator_UserColumnName="title" msprop:Generator_ColumnVarNameInTable="columntitle" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="title" msprop:Generator_ColumnPropNameInTable="titleColumn" minOccurs="0">
|
||||||
<xs:simpleType>
|
<xs:simpleType>
|
||||||
<xs:restriction base="xs:string">
|
<xs:restriction base="xs:string">
|
||||||
<xs:maxLength value="100" />
|
<xs:maxLength value="255" />
|
||||||
</xs:restriction>
|
</xs:restriction>
|
||||||
</xs:simpleType>
|
</xs:simpleType>
|
||||||
</xs:element>
|
</xs:element>
|
||||||
<xs:element name="album" msprop:Generator_UserColumnName="album" msprop:Generator_ColumnPropNameInRow="album" msprop:Generator_ColumnVarNameInTable="columnalbum" msprop:Generator_ColumnPropNameInTable="albumColumn" minOccurs="0">
|
<xs:element name="album" msprop:Generator_UserColumnName="album" msprop:Generator_ColumnVarNameInTable="columnalbum" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="album" msprop:Generator_ColumnPropNameInTable="albumColumn" minOccurs="0">
|
||||||
<xs:simpleType>
|
<xs:simpleType>
|
||||||
<xs:restriction base="xs:string">
|
<xs:restriction base="xs:string">
|
||||||
<xs:maxLength value="100" />
|
<xs:maxLength value="255" />
|
||||||
</xs:restriction>
|
</xs:restriction>
|
||||||
</xs:simpleType>
|
</xs:simpleType>
|
||||||
</xs:element>
|
</xs:element>
|
||||||
<xs:element name="length" msprop:Generator_UserColumnName="length" msprop:Generator_ColumnPropNameInRow="length" msprop:Generator_ColumnVarNameInTable="columnlength" msprop:Generator_ColumnPropNameInTable="lengthColumn" type="xs:int" minOccurs="0" />
|
<xs:element name="length" msprop:Generator_UserColumnName="length" msprop:Generator_ColumnVarNameInTable="columnlength" msprop:Generator_ColumnPropNameInRow="length" msprop:Generator_ColumnPropNameInTable="lengthColumn" type="xs:int" minOccurs="0" />
|
||||||
<xs:element name="track" msprop:Generator_UserColumnName="track" msprop:Generator_ColumnPropNameInRow="track" msprop:Generator_ColumnVarNameInTable="columntrack" msprop:Generator_ColumnPropNameInTable="trackColumn" type="xs:int" minOccurs="0" />
|
<xs:element name="track" msprop:Generator_UserColumnName="track" msprop:Generator_ColumnVarNameInTable="columntrack" msprop:Generator_ColumnPropNameInRow="track" msprop:Generator_ColumnPropNameInTable="trackColumn" type="xs:int" minOccurs="0" />
|
||||||
</xs:sequence>
|
</xs:sequence>
|
||||||
</xs:complexType>
|
</xs:complexType>
|
||||||
</xs:element>
|
</xs:element>
|
||||||
|
|||||||
@@ -1 +1,12 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!--<autogenerated>
|
||||||
|
This code was generated by a tool to store the dataset designer's layout information.
|
||||||
|
Changes to this file may cause incorrect behavior and will be lost if
|
||||||
|
the code is regenerated.
|
||||||
|
</autogenerated>-->
|
||||||
|
<DiagramLayout xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" ex:showrelationlabel="False" ViewPortX="-10" ViewPortY="18" xmlns:ex="urn:schemas-microsoft-com:xml-msdatasource-layout-extended" xmlns="urn:schemas-microsoft-com:xml-msdatasource-layout">
|
||||||
|
<Shapes>
|
||||||
|
<Shape ID="DesignTable:Playlist" ZOrder="1" X="70" Y="70" Height="210" Width="186" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="159" />
|
||||||
|
</Shapes>
|
||||||
|
<Connectors />
|
||||||
|
</DiagramLayout>
|
||||||
5
CUEPlayer/Deck.Designer.cs
generated
@@ -134,7 +134,7 @@
|
|||||||
this.mediaSlider.ButtonStyle = MediaSlider.MediaSlider.ButtonType.GlassOverlap;
|
this.mediaSlider.ButtonStyle = MediaSlider.MediaSlider.ButtonType.GlassOverlap;
|
||||||
this.mediaSlider.ContextMenuStrip = null;
|
this.mediaSlider.ContextMenuStrip = null;
|
||||||
this.mediaSlider.LargeChange = 2;
|
this.mediaSlider.LargeChange = 2;
|
||||||
this.mediaSlider.Location = new System.Drawing.Point(0, 115);
|
this.mediaSlider.Location = new System.Drawing.Point(0, 112);
|
||||||
this.mediaSlider.Margin = new System.Windows.Forms.Padding(0);
|
this.mediaSlider.Margin = new System.Windows.Forms.Padding(0);
|
||||||
this.mediaSlider.Maximum = 1;
|
this.mediaSlider.Maximum = 1;
|
||||||
this.mediaSlider.Minimum = 0;
|
this.mediaSlider.Minimum = 0;
|
||||||
@@ -242,7 +242,7 @@
|
|||||||
this.AllowDrop = true;
|
this.AllowDrop = true;
|
||||||
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(361, 145);
|
this.ClientSize = new System.Drawing.Size(361, 136);
|
||||||
this.ControlBox = false;
|
this.ControlBox = false;
|
||||||
this.Controls.Add(this.buttonNext);
|
this.Controls.Add(this.buttonNext);
|
||||||
this.Controls.Add(this.buttonRewind);
|
this.Controls.Add(this.buttonRewind);
|
||||||
@@ -262,6 +262,7 @@
|
|||||||
this.Name = "Deck";
|
this.Name = "Deck";
|
||||||
this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide;
|
this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide;
|
||||||
this.Text = "Deck";
|
this.Text = "Deck";
|
||||||
|
this.Load += new System.EventHandler(this.Deck_Load);
|
||||||
this.DragDrop += new System.Windows.Forms.DragEventHandler(this.Deck_DragDrop);
|
this.DragDrop += new System.Windows.Forms.DragEventHandler(this.Deck_DragDrop);
|
||||||
this.DragOver += new System.Windows.Forms.DragEventHandler(this.Deck_DragOver);
|
this.DragOver += new System.Windows.Forms.DragEventHandler(this.Deck_DragOver);
|
||||||
((System.ComponentModel.ISupportInitialize)(this.pictureBox)).EndInit();
|
((System.ComponentModel.ISupportInitialize)(this.pictureBox)).EndInit();
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ namespace CUEPlayer
|
|||||||
long playingFinish = 0;
|
long playingFinish = 0;
|
||||||
Thread playThread;
|
Thread playThread;
|
||||||
int iSource;
|
int iSource;
|
||||||
|
AudioBuffer buff;
|
||||||
MixingSource mixer;
|
MixingSource mixer;
|
||||||
MixingWriter writer;
|
MixingWriter writer;
|
||||||
Deck nextDeck;
|
Deck nextDeck;
|
||||||
@@ -72,12 +73,15 @@ namespace CUEPlayer
|
|||||||
textBoxAlbum.Text = playingRow < 0 ? "" : dataSet.Playlist[playingRow].album;
|
textBoxAlbum.Text = playingRow < 0 ? "" : dataSet.Playlist[playingRow].album;
|
||||||
textBoxTitle.Text = playingRow < 0 ? "" : dataSet.Playlist[playingRow].title;
|
textBoxTitle.Text = playingRow < 0 ? "" : dataSet.Playlist[playingRow].title;
|
||||||
textBoxDuration.Text = "";
|
textBoxDuration.Text = "";
|
||||||
pictureBox.Image = playingCue != null ? playingCue.Cover : pictureBox.InitialImage;
|
pictureBox.Image = playingCue != null && playingCue.Cover != null ? playingCue.Cover : pictureBox.InitialImage;
|
||||||
|
|
||||||
if (nextDeck != null && nextDeck.playingSource == null && playingRow >= 0 && playingRow < dataSet.Playlist.Rows.Count - 1)
|
if (nextDeck != null && nextDeck.playingSource == null && playingRow >= 0 && playingRow < dataSet.Playlist.Rows.Count - 1)
|
||||||
{
|
{
|
||||||
nextDeck.LoadDeck(playingRow + 1);
|
nextDeck.LoadDeck(playingRow + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (playThread != null)
|
||||||
|
(MdiParent as frmCUEPlayer).UpdateMetadata(textBoxArtist.Text, textBoxTitle.Text);
|
||||||
}
|
}
|
||||||
mediaSlider.Enabled = playingSource != null;
|
mediaSlider.Enabled = playingSource != null;
|
||||||
if (playingSource != null)
|
if (playingSource != null)
|
||||||
@@ -101,8 +105,6 @@ namespace CUEPlayer
|
|||||||
|
|
||||||
private void PlayThread()
|
private void PlayThread()
|
||||||
{
|
{
|
||||||
AudioBuffer buff = new AudioBuffer(playingSource.PCM, 0x2000);
|
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
do
|
do
|
||||||
@@ -151,6 +153,8 @@ namespace CUEPlayer
|
|||||||
nextDeck.playingRow = -1;
|
nextDeck.playingRow = -1;
|
||||||
nextDeck.needUpdate = true;
|
nextDeck.needUpdate = true;
|
||||||
}
|
}
|
||||||
|
if (buff == null || buff.PCM.SampleRate != playingSource.PCM.SampleRate || buff.PCM.ChannelCount != playingSource.PCM.ChannelCount || buff.PCM.BitsPerSample != playingSource.PCM.BitsPerSample)
|
||||||
|
buff = new AudioBuffer(playingSource.PCM, 0x2000);
|
||||||
playingSource.Read(buff, Math.Min(buff.Size, (int)(playingFinish - playingSource.Position)));
|
playingSource.Read(buff, Math.Min(buff.Size, (int)(playingFinish - playingSource.Position)));
|
||||||
writer.Write(buff);
|
writer.Write(buff);
|
||||||
}
|
}
|
||||||
@@ -205,12 +209,6 @@ namespace CUEPlayer
|
|||||||
|
|
||||||
private void buttonPlay_Click(object sender, EventArgs e)
|
private void buttonPlay_Click(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
if (playingSource == null)
|
|
||||||
{
|
|
||||||
Playlist playlist = (MdiParent as frmCUEPlayer).wndPlaylist;
|
|
||||||
LoadDeck(playlist.List.SelectedIndices[0]);
|
|
||||||
}
|
|
||||||
mixer.BufferPlaying(iSource, true);
|
|
||||||
if (playThread == null)
|
if (playThread == null)
|
||||||
{
|
{
|
||||||
playThread = new Thread(PlayThread);
|
playThread = new Thread(PlayThread);
|
||||||
@@ -219,6 +217,12 @@ namespace CUEPlayer
|
|||||||
playThread.Name = Text;
|
playThread.Name = Text;
|
||||||
playThread.Start();
|
playThread.Start();
|
||||||
}
|
}
|
||||||
|
if (playingSource == null)
|
||||||
|
{
|
||||||
|
Playlist playlist = (MdiParent as frmCUEPlayer).wndPlaylist;
|
||||||
|
LoadDeck(playlist.List.SelectedIndices[0]);
|
||||||
|
}
|
||||||
|
mixer.BufferPlaying(iSource, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void buttonStop_Click(object sender, EventArgs e)
|
private void buttonStop_Click(object sender, EventArgs e)
|
||||||
@@ -313,5 +317,10 @@ namespace CUEPlayer
|
|||||||
playingSource.Position = playingStart;
|
playingSource.Position = playingStart;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void Deck_Load(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
119
CUEPlayer/Icecast.Designer.cs
generated
Normal file
@@ -0,0 +1,119 @@
|
|||||||
|
namespace CUEPlayer
|
||||||
|
{
|
||||||
|
partial class Icecast
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Required designer variable.
|
||||||
|
/// </summary>
|
||||||
|
private System.ComponentModel.IContainer components = null;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Clean up any resources being used.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||||
|
protected override void Dispose(bool disposing)
|
||||||
|
{
|
||||||
|
if (disposing && (components != null))
|
||||||
|
{
|
||||||
|
components.Dispose();
|
||||||
|
}
|
||||||
|
base.Dispose(disposing);
|
||||||
|
}
|
||||||
|
|
||||||
|
#region Windows Form Designer generated code
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Required method for Designer support - do not modify
|
||||||
|
/// the contents of this method with the code editor.
|
||||||
|
/// </summary>
|
||||||
|
private void InitializeComponent()
|
||||||
|
{
|
||||||
|
this.components = new System.ComponentModel.Container();
|
||||||
|
this.timer1 = new System.Windows.Forms.Timer(this.components);
|
||||||
|
this.textBoxBytes = new System.Windows.Forms.TextBox();
|
||||||
|
this.checkBoxTransmit = new System.Windows.Forms.CheckBox();
|
||||||
|
this.buttonSettings = new System.Windows.Forms.Button();
|
||||||
|
this.textBoxLatency = new System.Windows.Forms.TextBox();
|
||||||
|
this.toolTip1 = new System.Windows.Forms.ToolTip(this.components);
|
||||||
|
this.SuspendLayout();
|
||||||
|
//
|
||||||
|
// timer1
|
||||||
|
//
|
||||||
|
this.timer1.Enabled = true;
|
||||||
|
this.timer1.Tick += new System.EventHandler(this.timer1_Tick);
|
||||||
|
//
|
||||||
|
// textBoxBytes
|
||||||
|
//
|
||||||
|
this.textBoxBytes.BorderStyle = System.Windows.Forms.BorderStyle.None;
|
||||||
|
this.textBoxBytes.Enabled = false;
|
||||||
|
this.textBoxBytes.Location = new System.Drawing.Point(2, 87);
|
||||||
|
this.textBoxBytes.Name = "textBoxBytes";
|
||||||
|
this.textBoxBytes.ReadOnly = true;
|
||||||
|
this.textBoxBytes.Size = new System.Drawing.Size(70, 13);
|
||||||
|
this.textBoxBytes.TabIndex = 14;
|
||||||
|
this.textBoxBytes.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
|
||||||
|
//
|
||||||
|
// checkBoxTransmit
|
||||||
|
//
|
||||||
|
this.checkBoxTransmit.Appearance = System.Windows.Forms.Appearance.Button;
|
||||||
|
this.checkBoxTransmit.AutoSize = true;
|
||||||
|
this.checkBoxTransmit.Image = global::CUEPlayer.Properties.Resources.transmit_blue;
|
||||||
|
this.checkBoxTransmit.Location = new System.Drawing.Point(14, 106);
|
||||||
|
this.checkBoxTransmit.Name = "checkBoxTransmit";
|
||||||
|
this.checkBoxTransmit.Size = new System.Drawing.Size(22, 22);
|
||||||
|
this.checkBoxTransmit.TabIndex = 15;
|
||||||
|
this.checkBoxTransmit.UseVisualStyleBackColor = true;
|
||||||
|
this.checkBoxTransmit.CheckedChanged += new System.EventHandler(this.checkBoxTransmit_CheckedChanged);
|
||||||
|
//
|
||||||
|
// buttonSettings
|
||||||
|
//
|
||||||
|
this.buttonSettings.AutoSize = true;
|
||||||
|
this.buttonSettings.Image = global::CUEPlayer.Properties.Resources.cog;
|
||||||
|
this.buttonSettings.Location = new System.Drawing.Point(42, 106);
|
||||||
|
this.buttonSettings.Name = "buttonSettings";
|
||||||
|
this.buttonSettings.Size = new System.Drawing.Size(22, 22);
|
||||||
|
this.buttonSettings.TabIndex = 16;
|
||||||
|
this.buttonSettings.UseVisualStyleBackColor = true;
|
||||||
|
this.buttonSettings.Click += new System.EventHandler(this.buttonSettings_Click);
|
||||||
|
//
|
||||||
|
// textBoxLatency
|
||||||
|
//
|
||||||
|
this.textBoxLatency.BorderStyle = System.Windows.Forms.BorderStyle.None;
|
||||||
|
this.textBoxLatency.Enabled = false;
|
||||||
|
this.textBoxLatency.Location = new System.Drawing.Point(2, 62);
|
||||||
|
this.textBoxLatency.Name = "textBoxLatency";
|
||||||
|
this.textBoxLatency.ReadOnly = true;
|
||||||
|
this.textBoxLatency.Size = new System.Drawing.Size(70, 13);
|
||||||
|
this.textBoxLatency.TabIndex = 17;
|
||||||
|
this.textBoxLatency.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
|
||||||
|
//
|
||||||
|
// Icecast
|
||||||
|
//
|
||||||
|
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||||
|
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||||
|
this.ClientSize = new System.Drawing.Size(74, 136);
|
||||||
|
this.Controls.Add(this.textBoxLatency);
|
||||||
|
this.Controls.Add(this.buttonSettings);
|
||||||
|
this.Controls.Add(this.checkBoxTransmit);
|
||||||
|
this.Controls.Add(this.textBoxBytes);
|
||||||
|
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow;
|
||||||
|
this.MaximizeBox = false;
|
||||||
|
this.MinimizeBox = false;
|
||||||
|
this.Name = "Icecast";
|
||||||
|
this.Text = "Icecast";
|
||||||
|
this.Load += new System.EventHandler(this.Icecast_Load);
|
||||||
|
this.ResumeLayout(false);
|
||||||
|
this.PerformLayout();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
private System.Windows.Forms.Timer timer1;
|
||||||
|
private System.Windows.Forms.TextBox textBoxBytes;
|
||||||
|
private System.Windows.Forms.CheckBox checkBoxTransmit;
|
||||||
|
private System.Windows.Forms.Button buttonSettings;
|
||||||
|
private System.Windows.Forms.TextBox textBoxLatency;
|
||||||
|
private System.Windows.Forms.ToolTip toolTip1;
|
||||||
|
}
|
||||||
|
}
|
||||||
142
CUEPlayer/Icecast.cs
Normal file
@@ -0,0 +1,142 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.ComponentModel;
|
||||||
|
using System.Data;
|
||||||
|
using System.Drawing;
|
||||||
|
using System.Text;
|
||||||
|
using System.Windows.Forms;
|
||||||
|
using System.Diagnostics;
|
||||||
|
using System.Threading;
|
||||||
|
using System.Net;
|
||||||
|
using CUETools.Codecs;
|
||||||
|
using CUETools.Codecs.Icecast;
|
||||||
|
|
||||||
|
namespace CUEPlayer
|
||||||
|
{
|
||||||
|
public partial class Icecast : Form
|
||||||
|
{
|
||||||
|
private IcecastWriter _icecastWriter;
|
||||||
|
private IcecastSettingsData _icecastSettings;
|
||||||
|
private CUETools.DSP.Mixer.MixingSource _mixer;
|
||||||
|
private Thread flushThread;
|
||||||
|
private AudioPipe buffer;
|
||||||
|
private bool close = false;
|
||||||
|
private int latency = 0;
|
||||||
|
|
||||||
|
public Icecast()
|
||||||
|
{
|
||||||
|
InitializeComponent();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Icecast_Load(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
if (Properties.Settings.Default.IcecastSettings == null)
|
||||||
|
Properties.Settings.Default.IcecastSettings = new IcecastSettingsData();
|
||||||
|
_icecastSettings = Properties.Settings.Default.IcecastSettings;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Init(frmCUEPlayer parent)
|
||||||
|
{
|
||||||
|
MdiParent = parent;
|
||||||
|
Show();
|
||||||
|
_mixer = parent.Mixer;
|
||||||
|
buffer = new AudioPipe(_mixer.PCM, _mixer.PCM.SampleRate * 10); // 10 secs
|
||||||
|
_mixer.AudioRead += new EventHandler<CUETools.DSP.Mixer.AudioReadEventArgs>(Mixer_AudioRead);
|
||||||
|
parent.updateMetadata += new EventHandler<UpdateMetadataEvent>(parent_updateMetadata);
|
||||||
|
|
||||||
|
flushThread = new Thread(FlushThread);
|
||||||
|
flushThread.Priority = ThreadPriority.AboveNormal;
|
||||||
|
flushThread.IsBackground = true;
|
||||||
|
flushThread.Name = "Icecast";
|
||||||
|
flushThread.Start();
|
||||||
|
}
|
||||||
|
|
||||||
|
void parent_updateMetadata(object sender, UpdateMetadataEvent e)
|
||||||
|
{
|
||||||
|
if (_icecastWriter != null)
|
||||||
|
_icecastWriter.UpdateMetadata(e.artist, e.title);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void FlushThread()
|
||||||
|
{
|
||||||
|
AudioBuffer result = new AudioBuffer(_mixer.PCM, _mixer.BufferSize);
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
buffer.Read(result, -1);
|
||||||
|
if (_icecastWriter != null && !close)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
_icecastWriter.Write(result);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
close = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (_icecastWriter != null && close)
|
||||||
|
{
|
||||||
|
_icecastWriter.Delete();
|
||||||
|
_icecastWriter = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Mixer_AudioRead(object sender, CUETools.DSP.Mixer.AudioReadEventArgs e)
|
||||||
|
{
|
||||||
|
latency = buffer.Write(e.buffer);
|
||||||
|
//int bs = buffer.Write(e.buffer);
|
||||||
|
//if (bs > 0)
|
||||||
|
//{
|
||||||
|
// Trace.WriteLine(string.Format("buffer size {0}", bs));
|
||||||
|
//}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void timer1_Tick(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
textBoxBytes.Text = _icecastWriter == null ? "" : string.Format("{0}K", _icecastWriter.BytesWritten/1024);
|
||||||
|
textBoxLatency.Text = (_icecastWriter == null || latency == 0 ) ? "" : string.Format("{0}", 1.0 * latency / buffer.PCM.SampleRate);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void checkBoxTransmit_CheckedChanged(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
close = !checkBoxTransmit.Checked;
|
||||||
|
this.toolTip1.SetToolTip(this.checkBoxTransmit, "");
|
||||||
|
if (!close && _icecastWriter == null)
|
||||||
|
{
|
||||||
|
IcecastWriter icecastWriter = new IcecastWriter(_mixer.PCM, _icecastSettings);
|
||||||
|
try
|
||||||
|
{
|
||||||
|
icecastWriter.Connect();
|
||||||
|
if (icecastWriter.Response.StatusCode == HttpStatusCode.OK)
|
||||||
|
_icecastWriter = icecastWriter;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
toolTip1.ToolTipIcon = ToolTipIcon.Error;
|
||||||
|
toolTip1.ToolTipTitle = icecastWriter.Response.StatusCode.ToString();
|
||||||
|
toolTip1.IsBalloon = true;
|
||||||
|
//toolTip1.Show(resp.StatusDescription, checkBoxTransmit, 0, 0, 2000);
|
||||||
|
toolTip1.SetToolTip(checkBoxTransmit, icecastWriter.Response.StatusDescription);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Trace.WriteLine(ex.Message);
|
||||||
|
icecastWriter.Close();
|
||||||
|
toolTip1.ToolTipIcon = ToolTipIcon.Error;
|
||||||
|
toolTip1.ToolTipTitle = "Exception";
|
||||||
|
toolTip1.IsBalloon = true;
|
||||||
|
//toolTip1.Show(ex.Message, checkBoxTransmit, 0, 0, 2000);
|
||||||
|
toolTip1.SetToolTip(checkBoxTransmit, ex.Message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void buttonSettings_Click(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
IcecastSettings frm = new IcecastSettings(_icecastSettings);
|
||||||
|
if (frm.ShowDialog(this) == DialogResult.OK)
|
||||||
|
Properties.Settings.Default.Save();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
126
CUEPlayer/Icecast.resx
Normal file
@@ -0,0 +1,126 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<root>
|
||||||
|
<!--
|
||||||
|
Microsoft ResX Schema
|
||||||
|
|
||||||
|
Version 2.0
|
||||||
|
|
||||||
|
The primary goals of this format is to allow a simple XML format
|
||||||
|
that is mostly human readable. The generation and parsing of the
|
||||||
|
various data types are done through the TypeConverter classes
|
||||||
|
associated with the data types.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
... ado.net/XML headers & schema ...
|
||||||
|
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||||
|
<resheader name="version">2.0</resheader>
|
||||||
|
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||||
|
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||||
|
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||||
|
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||||
|
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||||
|
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||||
|
</data>
|
||||||
|
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
|
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||||
|
<comment>This is a comment</comment>
|
||||||
|
</data>
|
||||||
|
|
||||||
|
There are any number of "resheader" rows that contain simple
|
||||||
|
name/value pairs.
|
||||||
|
|
||||||
|
Each data row contains a name, and value. The row also contains a
|
||||||
|
type or mimetype. Type corresponds to a .NET class that support
|
||||||
|
text/value conversion through the TypeConverter architecture.
|
||||||
|
Classes that don't support this are serialized and stored with the
|
||||||
|
mimetype set.
|
||||||
|
|
||||||
|
The mimetype is used for serialized objects, and tells the
|
||||||
|
ResXResourceReader how to depersist the object. This is currently not
|
||||||
|
extensible. For a given mimetype the value must be set accordingly:
|
||||||
|
|
||||||
|
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||||
|
that the ResXResourceWriter will generate, however the reader can
|
||||||
|
read any of the formats listed below.
|
||||||
|
|
||||||
|
mimetype: application/x-microsoft.net.object.binary.base64
|
||||||
|
value : The object must be serialized with
|
||||||
|
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||||
|
: and then encoded with base64 encoding.
|
||||||
|
|
||||||
|
mimetype: application/x-microsoft.net.object.soap.base64
|
||||||
|
value : The object must be serialized with
|
||||||
|
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||||
|
: and then encoded with base64 encoding.
|
||||||
|
|
||||||
|
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||||
|
value : The object must be serialized into a byte array
|
||||||
|
: using a System.ComponentModel.TypeConverter
|
||||||
|
: and then encoded with base64 encoding.
|
||||||
|
-->
|
||||||
|
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||||
|
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||||
|
<xsd:element name="root" msdata:IsDataSet="true">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:choice maxOccurs="unbounded">
|
||||||
|
<xsd:element name="metadata">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||||
|
<xsd:attribute name="type" type="xsd:string" />
|
||||||
|
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||||
|
<xsd:attribute ref="xml:space" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:element name="assembly">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:attribute name="alias" type="xsd:string" />
|
||||||
|
<xsd:attribute name="name" type="xsd:string" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:element name="data">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||||
|
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||||
|
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||||
|
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||||
|
<xsd:attribute ref="xml:space" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:element name="resheader">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
</xsd:choice>
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
</xsd:schema>
|
||||||
|
<resheader name="resmimetype">
|
||||||
|
<value>text/microsoft-resx</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="version">
|
||||||
|
<value>2.0</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="reader">
|
||||||
|
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="writer">
|
||||||
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</resheader>
|
||||||
|
<metadata name="timer1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||||
|
<value>17, 17</value>
|
||||||
|
</metadata>
|
||||||
|
<metadata name="toolTip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||||
|
<value>104, 17</value>
|
||||||
|
</metadata>
|
||||||
|
</root>
|
||||||
301
CUEPlayer/IcecastSettings.Designer.cs
generated
Normal file
@@ -0,0 +1,301 @@
|
|||||||
|
namespace CUEPlayer
|
||||||
|
{
|
||||||
|
partial class IcecastSettings
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Required designer variable.
|
||||||
|
/// </summary>
|
||||||
|
private System.ComponentModel.IContainer components = null;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Clean up any resources being used.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||||
|
protected override void Dispose(bool disposing)
|
||||||
|
{
|
||||||
|
if (disposing && (components != null))
|
||||||
|
{
|
||||||
|
components.Dispose();
|
||||||
|
}
|
||||||
|
base.Dispose(disposing);
|
||||||
|
}
|
||||||
|
|
||||||
|
#region Windows Form Designer generated code
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Required method for Designer support - do not modify
|
||||||
|
/// the contents of this method with the code editor.
|
||||||
|
/// </summary>
|
||||||
|
private void InitializeComponent()
|
||||||
|
{
|
||||||
|
this.components = new System.ComponentModel.Container();
|
||||||
|
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(IcecastSettings));
|
||||||
|
this.buttonCancel = new System.Windows.Forms.Button();
|
||||||
|
this.buttonOk = new System.Windows.Forms.Button();
|
||||||
|
this.textBoxServer = new System.Windows.Forms.TextBox();
|
||||||
|
this.textBoxPort = new System.Windows.Forms.TextBox();
|
||||||
|
this.textBoxPassword = new System.Windows.Forms.TextBox();
|
||||||
|
this.textBoxMount = new System.Windows.Forms.TextBox();
|
||||||
|
this.textBoxName = new System.Windows.Forms.TextBox();
|
||||||
|
this.textBoxDesctiption = new System.Windows.Forms.TextBox();
|
||||||
|
this.textBoxWeb = new System.Windows.Forms.TextBox();
|
||||||
|
this.comboBoxGenre = new System.Windows.Forms.ComboBox();
|
||||||
|
this.labelServer = new System.Windows.Forms.Label();
|
||||||
|
this.labelPort = new System.Windows.Forms.Label();
|
||||||
|
this.labelPassword = new System.Windows.Forms.Label();
|
||||||
|
this.labelMount = new System.Windows.Forms.Label();
|
||||||
|
this.labelStationName = new System.Windows.Forms.Label();
|
||||||
|
this.labelStationDescription = new System.Windows.Forms.Label();
|
||||||
|
this.labelWeb = new System.Windows.Forms.Label();
|
||||||
|
this.labelGenre = new System.Windows.Forms.Label();
|
||||||
|
this.textBoxMP3Options = new System.Windows.Forms.TextBox();
|
||||||
|
this.labelMP3Options = new System.Windows.Forms.Label();
|
||||||
|
this.icecastSettingsDataBindingSource = new System.Windows.Forms.BindingSource(this.components);
|
||||||
|
((System.ComponentModel.ISupportInitialize)(this.icecastSettingsDataBindingSource)).BeginInit();
|
||||||
|
this.SuspendLayout();
|
||||||
|
//
|
||||||
|
// buttonCancel
|
||||||
|
//
|
||||||
|
this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
|
||||||
|
this.buttonCancel.Location = new System.Drawing.Point(197, 272);
|
||||||
|
this.buttonCancel.Name = "buttonCancel";
|
||||||
|
this.buttonCancel.Size = new System.Drawing.Size(75, 23);
|
||||||
|
this.buttonCancel.TabIndex = 0;
|
||||||
|
this.buttonCancel.Text = "Cancel";
|
||||||
|
this.buttonCancel.UseVisualStyleBackColor = true;
|
||||||
|
//
|
||||||
|
// buttonOk
|
||||||
|
//
|
||||||
|
this.buttonOk.DialogResult = System.Windows.Forms.DialogResult.OK;
|
||||||
|
this.buttonOk.Location = new System.Drawing.Point(116, 272);
|
||||||
|
this.buttonOk.Name = "buttonOk";
|
||||||
|
this.buttonOk.Size = new System.Drawing.Size(75, 23);
|
||||||
|
this.buttonOk.TabIndex = 1;
|
||||||
|
this.buttonOk.Text = "OK";
|
||||||
|
this.buttonOk.UseVisualStyleBackColor = true;
|
||||||
|
//
|
||||||
|
// textBoxServer
|
||||||
|
//
|
||||||
|
this.textBoxServer.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.icecastSettingsDataBindingSource, "Server", true));
|
||||||
|
this.textBoxServer.Location = new System.Drawing.Point(91, 12);
|
||||||
|
this.textBoxServer.Name = "textBoxServer";
|
||||||
|
this.textBoxServer.Size = new System.Drawing.Size(181, 20);
|
||||||
|
this.textBoxServer.TabIndex = 2;
|
||||||
|
//
|
||||||
|
// textBoxPort
|
||||||
|
//
|
||||||
|
this.textBoxPort.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.icecastSettingsDataBindingSource, "Port", true));
|
||||||
|
this.textBoxPort.Location = new System.Drawing.Point(91, 38);
|
||||||
|
this.textBoxPort.Name = "textBoxPort";
|
||||||
|
this.textBoxPort.Size = new System.Drawing.Size(181, 20);
|
||||||
|
this.textBoxPort.TabIndex = 3;
|
||||||
|
//
|
||||||
|
// textBoxPassword
|
||||||
|
//
|
||||||
|
this.textBoxPassword.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.icecastSettingsDataBindingSource, "Password", true));
|
||||||
|
this.textBoxPassword.Location = new System.Drawing.Point(91, 64);
|
||||||
|
this.textBoxPassword.Name = "textBoxPassword";
|
||||||
|
this.textBoxPassword.Size = new System.Drawing.Size(181, 20);
|
||||||
|
this.textBoxPassword.TabIndex = 4;
|
||||||
|
this.textBoxPassword.UseSystemPasswordChar = true;
|
||||||
|
//
|
||||||
|
// textBoxMount
|
||||||
|
//
|
||||||
|
this.textBoxMount.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.icecastSettingsDataBindingSource, "Mount", true));
|
||||||
|
this.textBoxMount.Location = new System.Drawing.Point(91, 90);
|
||||||
|
this.textBoxMount.Name = "textBoxMount";
|
||||||
|
this.textBoxMount.Size = new System.Drawing.Size(181, 20);
|
||||||
|
this.textBoxMount.TabIndex = 5;
|
||||||
|
//
|
||||||
|
// textBoxName
|
||||||
|
//
|
||||||
|
this.textBoxName.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.icecastSettingsDataBindingSource, "Name", true));
|
||||||
|
this.textBoxName.Location = new System.Drawing.Point(91, 116);
|
||||||
|
this.textBoxName.Name = "textBoxName";
|
||||||
|
this.textBoxName.Size = new System.Drawing.Size(181, 20);
|
||||||
|
this.textBoxName.TabIndex = 6;
|
||||||
|
//
|
||||||
|
// textBoxDesctiption
|
||||||
|
//
|
||||||
|
this.textBoxDesctiption.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.icecastSettingsDataBindingSource, "Desctiption", true));
|
||||||
|
this.textBoxDesctiption.Location = new System.Drawing.Point(91, 142);
|
||||||
|
this.textBoxDesctiption.Name = "textBoxDesctiption";
|
||||||
|
this.textBoxDesctiption.Size = new System.Drawing.Size(181, 20);
|
||||||
|
this.textBoxDesctiption.TabIndex = 7;
|
||||||
|
//
|
||||||
|
// textBoxWeb
|
||||||
|
//
|
||||||
|
this.textBoxWeb.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.icecastSettingsDataBindingSource, "Url", true));
|
||||||
|
this.textBoxWeb.Location = new System.Drawing.Point(91, 168);
|
||||||
|
this.textBoxWeb.Name = "textBoxWeb";
|
||||||
|
this.textBoxWeb.Size = new System.Drawing.Size(181, 20);
|
||||||
|
this.textBoxWeb.TabIndex = 8;
|
||||||
|
//
|
||||||
|
// comboBoxGenre
|
||||||
|
//
|
||||||
|
this.comboBoxGenre.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.icecastSettingsDataBindingSource, "Genre", true));
|
||||||
|
this.comboBoxGenre.FormattingEnabled = true;
|
||||||
|
this.comboBoxGenre.Location = new System.Drawing.Point(91, 194);
|
||||||
|
this.comboBoxGenre.Name = "comboBoxGenre";
|
||||||
|
this.comboBoxGenre.Size = new System.Drawing.Size(181, 21);
|
||||||
|
this.comboBoxGenre.TabIndex = 9;
|
||||||
|
//
|
||||||
|
// labelServer
|
||||||
|
//
|
||||||
|
this.labelServer.AutoSize = true;
|
||||||
|
this.labelServer.Location = new System.Drawing.Point(12, 15);
|
||||||
|
this.labelServer.Name = "labelServer";
|
||||||
|
this.labelServer.Size = new System.Drawing.Size(38, 13);
|
||||||
|
this.labelServer.TabIndex = 10;
|
||||||
|
this.labelServer.Text = "Server";
|
||||||
|
//
|
||||||
|
// labelPort
|
||||||
|
//
|
||||||
|
this.labelPort.AutoSize = true;
|
||||||
|
this.labelPort.Location = new System.Drawing.Point(12, 41);
|
||||||
|
this.labelPort.Name = "labelPort";
|
||||||
|
this.labelPort.Size = new System.Drawing.Size(26, 13);
|
||||||
|
this.labelPort.TabIndex = 11;
|
||||||
|
this.labelPort.Text = "Port";
|
||||||
|
//
|
||||||
|
// labelPassword
|
||||||
|
//
|
||||||
|
this.labelPassword.AutoSize = true;
|
||||||
|
this.labelPassword.Location = new System.Drawing.Point(12, 67);
|
||||||
|
this.labelPassword.Name = "labelPassword";
|
||||||
|
this.labelPassword.Size = new System.Drawing.Size(53, 13);
|
||||||
|
this.labelPassword.TabIndex = 12;
|
||||||
|
this.labelPassword.Text = "Password";
|
||||||
|
//
|
||||||
|
// labelMount
|
||||||
|
//
|
||||||
|
this.labelMount.AutoSize = true;
|
||||||
|
this.labelMount.Location = new System.Drawing.Point(12, 93);
|
||||||
|
this.labelMount.Name = "labelMount";
|
||||||
|
this.labelMount.Size = new System.Drawing.Size(37, 13);
|
||||||
|
this.labelMount.TabIndex = 13;
|
||||||
|
this.labelMount.Text = "Mount";
|
||||||
|
//
|
||||||
|
// labelStationName
|
||||||
|
//
|
||||||
|
this.labelStationName.AutoSize = true;
|
||||||
|
this.labelStationName.Location = new System.Drawing.Point(12, 119);
|
||||||
|
this.labelStationName.Name = "labelStationName";
|
||||||
|
this.labelStationName.Size = new System.Drawing.Size(35, 13);
|
||||||
|
this.labelStationName.TabIndex = 14;
|
||||||
|
this.labelStationName.Text = "Name";
|
||||||
|
//
|
||||||
|
// labelStationDescription
|
||||||
|
//
|
||||||
|
this.labelStationDescription.AutoSize = true;
|
||||||
|
this.labelStationDescription.Location = new System.Drawing.Point(12, 145);
|
||||||
|
this.labelStationDescription.Name = "labelStationDescription";
|
||||||
|
this.labelStationDescription.Size = new System.Drawing.Size(60, 13);
|
||||||
|
this.labelStationDescription.TabIndex = 15;
|
||||||
|
this.labelStationDescription.Text = "Description";
|
||||||
|
//
|
||||||
|
// labelWeb
|
||||||
|
//
|
||||||
|
this.labelWeb.AutoSize = true;
|
||||||
|
this.labelWeb.Location = new System.Drawing.Point(12, 171);
|
||||||
|
this.labelWeb.Name = "labelWeb";
|
||||||
|
this.labelWeb.Size = new System.Drawing.Size(30, 13);
|
||||||
|
this.labelWeb.TabIndex = 16;
|
||||||
|
this.labelWeb.Text = "Web";
|
||||||
|
//
|
||||||
|
// labelGenre
|
||||||
|
//
|
||||||
|
this.labelGenre.AutoSize = true;
|
||||||
|
this.labelGenre.Location = new System.Drawing.Point(12, 197);
|
||||||
|
this.labelGenre.Name = "labelGenre";
|
||||||
|
this.labelGenre.Size = new System.Drawing.Size(36, 13);
|
||||||
|
this.labelGenre.TabIndex = 17;
|
||||||
|
this.labelGenre.Text = "Genre";
|
||||||
|
//
|
||||||
|
// textBoxMP3Options
|
||||||
|
//
|
||||||
|
this.textBoxMP3Options.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.icecastSettingsDataBindingSource, "MP3Options", true));
|
||||||
|
this.textBoxMP3Options.Location = new System.Drawing.Point(91, 221);
|
||||||
|
this.textBoxMP3Options.Name = "textBoxMP3Options";
|
||||||
|
this.textBoxMP3Options.Size = new System.Drawing.Size(181, 20);
|
||||||
|
this.textBoxMP3Options.TabIndex = 18;
|
||||||
|
//
|
||||||
|
// labelMP3Options
|
||||||
|
//
|
||||||
|
this.labelMP3Options.AutoSize = true;
|
||||||
|
this.labelMP3Options.Location = new System.Drawing.Point(12, 224);
|
||||||
|
this.labelMP3Options.Name = "labelMP3Options";
|
||||||
|
this.labelMP3Options.Size = new System.Drawing.Size(68, 13);
|
||||||
|
this.labelMP3Options.TabIndex = 19;
|
||||||
|
this.labelMP3Options.Text = "MP3 Options";
|
||||||
|
//
|
||||||
|
// icecastSettingsDataBindingSource
|
||||||
|
//
|
||||||
|
this.icecastSettingsDataBindingSource.DataSource = typeof(CUETools.Codecs.Icecast.IcecastSettingsData);
|
||||||
|
//
|
||||||
|
// IcecastSettings
|
||||||
|
//
|
||||||
|
this.AcceptButton = this.buttonOk;
|
||||||
|
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||||
|
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||||
|
this.CancelButton = this.buttonCancel;
|
||||||
|
this.ClientSize = new System.Drawing.Size(284, 307);
|
||||||
|
this.Controls.Add(this.labelMP3Options);
|
||||||
|
this.Controls.Add(this.textBoxMP3Options);
|
||||||
|
this.Controls.Add(this.labelGenre);
|
||||||
|
this.Controls.Add(this.labelWeb);
|
||||||
|
this.Controls.Add(this.labelStationDescription);
|
||||||
|
this.Controls.Add(this.labelStationName);
|
||||||
|
this.Controls.Add(this.labelMount);
|
||||||
|
this.Controls.Add(this.labelPassword);
|
||||||
|
this.Controls.Add(this.labelPort);
|
||||||
|
this.Controls.Add(this.labelServer);
|
||||||
|
this.Controls.Add(this.comboBoxGenre);
|
||||||
|
this.Controls.Add(this.textBoxWeb);
|
||||||
|
this.Controls.Add(this.textBoxDesctiption);
|
||||||
|
this.Controls.Add(this.textBoxName);
|
||||||
|
this.Controls.Add(this.textBoxMount);
|
||||||
|
this.Controls.Add(this.textBoxPassword);
|
||||||
|
this.Controls.Add(this.textBoxPort);
|
||||||
|
this.Controls.Add(this.textBoxServer);
|
||||||
|
this.Controls.Add(this.buttonOk);
|
||||||
|
this.Controls.Add(this.buttonCancel);
|
||||||
|
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
|
||||||
|
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
|
||||||
|
this.MaximizeBox = false;
|
||||||
|
this.MinimizeBox = false;
|
||||||
|
this.Name = "IcecastSettings";
|
||||||
|
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
|
||||||
|
this.Text = "Icecast Settings";
|
||||||
|
this.Load += new System.EventHandler(this.IcecastSettings_Load);
|
||||||
|
((System.ComponentModel.ISupportInitialize)(this.icecastSettingsDataBindingSource)).EndInit();
|
||||||
|
this.ResumeLayout(false);
|
||||||
|
this.PerformLayout();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
private System.Windows.Forms.Button buttonCancel;
|
||||||
|
private System.Windows.Forms.Button buttonOk;
|
||||||
|
private System.Windows.Forms.TextBox textBoxServer;
|
||||||
|
private System.Windows.Forms.TextBox textBoxPort;
|
||||||
|
private System.Windows.Forms.TextBox textBoxPassword;
|
||||||
|
private System.Windows.Forms.TextBox textBoxMount;
|
||||||
|
private System.Windows.Forms.TextBox textBoxName;
|
||||||
|
private System.Windows.Forms.TextBox textBoxDesctiption;
|
||||||
|
private System.Windows.Forms.TextBox textBoxWeb;
|
||||||
|
private System.Windows.Forms.ComboBox comboBoxGenre;
|
||||||
|
private System.Windows.Forms.Label labelServer;
|
||||||
|
private System.Windows.Forms.Label labelPort;
|
||||||
|
private System.Windows.Forms.Label labelPassword;
|
||||||
|
private System.Windows.Forms.Label labelMount;
|
||||||
|
private System.Windows.Forms.Label labelStationName;
|
||||||
|
private System.Windows.Forms.Label labelStationDescription;
|
||||||
|
private System.Windows.Forms.Label labelWeb;
|
||||||
|
private System.Windows.Forms.Label labelGenre;
|
||||||
|
private System.Windows.Forms.BindingSource icecastSettingsDataBindingSource;
|
||||||
|
private System.Windows.Forms.TextBox textBoxMP3Options;
|
||||||
|
private System.Windows.Forms.Label labelMP3Options;
|
||||||
|
}
|
||||||
|
}
|
||||||
25
CUEPlayer/IcecastSettings.cs
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.ComponentModel;
|
||||||
|
using System.Data;
|
||||||
|
using System.Drawing;
|
||||||
|
using System.Text;
|
||||||
|
using System.Windows.Forms;
|
||||||
|
using CUETools.Codecs.Icecast;
|
||||||
|
|
||||||
|
namespace CUEPlayer
|
||||||
|
{
|
||||||
|
public partial class IcecastSettings : Form
|
||||||
|
{
|
||||||
|
public IcecastSettings(IcecastSettingsData data)
|
||||||
|
{
|
||||||
|
InitializeComponent();
|
||||||
|
icecastSettingsDataBindingSource.DataSource = data;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void IcecastSettings_Load(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
148
CUEPlayer/IcecastSettings.resx
Normal file
@@ -0,0 +1,148 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<root>
|
||||||
|
<!--
|
||||||
|
Microsoft ResX Schema
|
||||||
|
|
||||||
|
Version 2.0
|
||||||
|
|
||||||
|
The primary goals of this format is to allow a simple XML format
|
||||||
|
that is mostly human readable. The generation and parsing of the
|
||||||
|
various data types are done through the TypeConverter classes
|
||||||
|
associated with the data types.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
... ado.net/XML headers & schema ...
|
||||||
|
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||||
|
<resheader name="version">2.0</resheader>
|
||||||
|
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||||
|
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||||
|
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||||
|
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||||
|
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||||
|
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||||
|
</data>
|
||||||
|
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
|
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||||
|
<comment>This is a comment</comment>
|
||||||
|
</data>
|
||||||
|
|
||||||
|
There are any number of "resheader" rows that contain simple
|
||||||
|
name/value pairs.
|
||||||
|
|
||||||
|
Each data row contains a name, and value. The row also contains a
|
||||||
|
type or mimetype. Type corresponds to a .NET class that support
|
||||||
|
text/value conversion through the TypeConverter architecture.
|
||||||
|
Classes that don't support this are serialized and stored with the
|
||||||
|
mimetype set.
|
||||||
|
|
||||||
|
The mimetype is used for serialized objects, and tells the
|
||||||
|
ResXResourceReader how to depersist the object. This is currently not
|
||||||
|
extensible. For a given mimetype the value must be set accordingly:
|
||||||
|
|
||||||
|
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||||
|
that the ResXResourceWriter will generate, however the reader can
|
||||||
|
read any of the formats listed below.
|
||||||
|
|
||||||
|
mimetype: application/x-microsoft.net.object.binary.base64
|
||||||
|
value : The object must be serialized with
|
||||||
|
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||||
|
: and then encoded with base64 encoding.
|
||||||
|
|
||||||
|
mimetype: application/x-microsoft.net.object.soap.base64
|
||||||
|
value : The object must be serialized with
|
||||||
|
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||||
|
: and then encoded with base64 encoding.
|
||||||
|
|
||||||
|
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||||
|
value : The object must be serialized into a byte array
|
||||||
|
: using a System.ComponentModel.TypeConverter
|
||||||
|
: and then encoded with base64 encoding.
|
||||||
|
-->
|
||||||
|
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||||
|
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||||
|
<xsd:element name="root" msdata:IsDataSet="true">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:choice maxOccurs="unbounded">
|
||||||
|
<xsd:element name="metadata">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||||
|
<xsd:attribute name="type" type="xsd:string" />
|
||||||
|
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||||
|
<xsd:attribute ref="xml:space" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:element name="assembly">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:attribute name="alias" type="xsd:string" />
|
||||||
|
<xsd:attribute name="name" type="xsd:string" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:element name="data">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||||
|
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||||
|
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||||
|
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||||
|
<xsd:attribute ref="xml:space" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:element name="resheader">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
</xsd:choice>
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
</xsd:schema>
|
||||||
|
<resheader name="resmimetype">
|
||||||
|
<value>text/microsoft-resx</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="version">
|
||||||
|
<value>2.0</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="reader">
|
||||||
|
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="writer">
|
||||||
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</resheader>
|
||||||
|
<metadata name="icecastSettingsDataBindingSource.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||||
|
<value>17, 17</value>
|
||||||
|
</metadata>
|
||||||
|
<assembly alias="System.Drawing" name="System.Drawing, Version=2.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">
|
||||||
|
<value>
|
||||||
|
AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAACjo6OampqaTgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAF9fX01aWlpKWlpaAwAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAra2tS6Ojo+Sampp8AAAAAAAAAAAAAAAAAAAAAGxsbIBlZWXAX19fRQAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACtra28o6Oj95qampwAAAAAAAAAAH19faN0dHTzbGxsrgAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAtra2MK2trf2jo6P+mpqaxJCQkMSGhob+fX199HR0
|
||||||
|
dCQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC2traWra2t/Ofk4//l4uH/kJCQ/IaG
|
||||||
|
hocAAAAAAAAAAAAAAAAAAAAAAAAAAOCfam/emmZm3ZdfDwAAAAAAAAAAv7+/Era2tvOtra3+o6Oj/pqa
|
||||||
|
muWQkJAMAAAAAAAAAAAAAAAA1Xs4P9V7OFXipXXb5K6E/96davbdmWMG3ZZcPgAAAAC/v7+j2tnY/9vZ
|
||||||
|
2P+jo6OiAAAAANV+PCzVfTkF1Xs45NmGSf/VezjV5auA+e3Fp//ipHX/4J9tCd+daP/dl2Pq0q2PPL+/
|
||||||
|
v/u2trb6vZ+ISNiGR+HXhEP/1YI9CdV/PP/jp3r/1Xs48+ayifnuyq3/5ap+/+OneAPionL246d3/96a
|
||||||
|
Zj/Hx8dOv7+/KtuPUz/dlV3/2IlK9teFRAPVgkD/46p9/9V9OfDotpHY7suu/+Wxif/lrYIJ46h7q+e1
|
||||||
|
jv/goXCq3p1qP92ZYz/dllyq4qV2/9qOU6vaiU0J2YlI/+Knev/Vgj/V6byZkOzHqf/qvZv/5rOLQuWu
|
||||||
|
hRvlq4De6LWP/+Srf//jp3r/5KyA/92XY97dlFsb25FWQt2XX//goG7/2IZHjevBny3rvpz87syw/+i4
|
||||||
|
lPzmto4f5rKJDOWug4Tlqn7G46d4xuKicoTgn2oM3ppmH92XX/zlrID/249T/NqLTioAAAAA7MOikO7J
|
||||||
|
rv/vyq3/6buX/Oi2kULmtYwJAAAAAAAAAADjqHsJ4qV1QuChcPzlsIb/4qh6/92WXI0AAAAAAAAAAOzE
|
||||||
|
pQbsxKS37squ//DNtP/rwqL/6LqV/+i2kf/ms4v/5a+G/+ezi//qu5n/5rGI/+CfbbfenGcGAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAOzEpXLsw6L2782x//HQuP/x07v/8NC5/+3Lrv/rwKD/5a6D9uWqfnIAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAA7MSlJ+zEpY3sw6LM67+f/Ou+mvzpu5fM6LaRjea1jCcAAAAAAAAAAAAA
|
||||||
|
AAAAAAAA5+MAAOPHAADxjwAA8A8AAPgfAAAYHAAABCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgYEAAIAB
|
||||||
|
AADgBwAA8A8AAA==
|
||||||
|
</value>
|
||||||
|
</data>
|
||||||
|
</root>
|
||||||
93
CUEPlayer/Output.Designer.cs
generated
@@ -29,12 +29,14 @@
|
|||||||
private void InitializeComponent()
|
private void InitializeComponent()
|
||||||
{
|
{
|
||||||
this.components = new System.ComponentModel.Container();
|
this.components = new System.ComponentModel.Container();
|
||||||
|
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Output));
|
||||||
this.mediaSliderVolume = new MediaSlider.MediaSlider();
|
this.mediaSliderVolume = new MediaSlider.MediaSlider();
|
||||||
this.peakMeterCtrl1 = new Ernzo.WinForms.Controls.PeakMeterCtrl();
|
this.peakMeterCtrl1 = new Ernzo.WinForms.Controls.PeakMeterCtrl();
|
||||||
this.buttonPause = new System.Windows.Forms.Button();
|
|
||||||
this.buttonPlay = new System.Windows.Forms.Button();
|
|
||||||
this.buttonStop = new System.Windows.Forms.Button();
|
|
||||||
this.timer1 = new System.Windows.Forms.Timer(this.components);
|
this.timer1 = new System.Windows.Forms.Timer(this.components);
|
||||||
|
this.checkBoxMute = new System.Windows.Forms.CheckBox();
|
||||||
|
this.imageList1 = new System.Windows.Forms.ImageList(this.components);
|
||||||
|
this.outputBindingSource = new System.Windows.Forms.BindingSource(this.components);
|
||||||
|
((System.ComponentModel.ISupportInitialize)(this.outputBindingSource)).BeginInit();
|
||||||
this.SuspendLayout();
|
this.SuspendLayout();
|
||||||
//
|
//
|
||||||
// mediaSliderVolume
|
// mediaSliderVolume
|
||||||
@@ -61,7 +63,7 @@
|
|||||||
this.mediaSliderVolume.Name = "mediaSliderVolume";
|
this.mediaSliderVolume.Name = "mediaSliderVolume";
|
||||||
this.mediaSliderVolume.Orientation = System.Windows.Forms.Orientation.Vertical;
|
this.mediaSliderVolume.Orientation = System.Windows.Forms.Orientation.Vertical;
|
||||||
this.mediaSliderVolume.ShowButtonOnHover = false;
|
this.mediaSliderVolume.ShowButtonOnHover = false;
|
||||||
this.mediaSliderVolume.Size = new System.Drawing.Size(37, 114);
|
this.mediaSliderVolume.Size = new System.Drawing.Size(37, 101);
|
||||||
this.mediaSliderVolume.SliderFlyOut = MediaSlider.MediaSlider.FlyOutStyle.None;
|
this.mediaSliderVolume.SliderFlyOut = MediaSlider.MediaSlider.FlyOutStyle.None;
|
||||||
this.mediaSliderVolume.SmallChange = 1;
|
this.mediaSliderVolume.SmallChange = 1;
|
||||||
this.mediaSliderVolume.SmoothScrolling = true;
|
this.mediaSliderVolume.SmoothScrolling = true;
|
||||||
@@ -91,63 +93,61 @@
|
|||||||
this.peakMeterCtrl1.FalloffColor = System.Drawing.Color.Blue;
|
this.peakMeterCtrl1.FalloffColor = System.Drawing.Color.Blue;
|
||||||
this.peakMeterCtrl1.GridColor = System.Drawing.Color.Gainsboro;
|
this.peakMeterCtrl1.GridColor = System.Drawing.Color.Gainsboro;
|
||||||
this.peakMeterCtrl1.LEDCount = 25;
|
this.peakMeterCtrl1.LEDCount = 25;
|
||||||
this.peakMeterCtrl1.Location = new System.Drawing.Point(60, 9);
|
this.peakMeterCtrl1.Location = new System.Drawing.Point(46, 9);
|
||||||
this.peakMeterCtrl1.Margin = new System.Windows.Forms.Padding(0);
|
this.peakMeterCtrl1.Margin = new System.Windows.Forms.Padding(0);
|
||||||
this.peakMeterCtrl1.Name = "peakMeterCtrl1";
|
this.peakMeterCtrl1.Name = "peakMeterCtrl1";
|
||||||
this.peakMeterCtrl1.Size = new System.Drawing.Size(15, 109);
|
this.peakMeterCtrl1.Size = new System.Drawing.Size(15, 101);
|
||||||
this.peakMeterCtrl1.TabIndex = 13;
|
this.peakMeterCtrl1.TabIndex = 13;
|
||||||
this.peakMeterCtrl1.Text = "peakMeterCtrl1";
|
this.peakMeterCtrl1.Text = "peakMeterCtrl1";
|
||||||
//
|
//
|
||||||
// buttonPause
|
|
||||||
//
|
|
||||||
this.buttonPause.Image = global::CUEPlayer.Properties.Resources.control_pause_blue;
|
|
||||||
this.buttonPause.Location = new System.Drawing.Point(59, 130);
|
|
||||||
this.buttonPause.Name = "buttonPause";
|
|
||||||
this.buttonPause.Size = new System.Drawing.Size(25, 25);
|
|
||||||
this.buttonPause.TabIndex = 12;
|
|
||||||
this.buttonPause.UseVisualStyleBackColor = true;
|
|
||||||
this.buttonPause.Click += new System.EventHandler(this.buttonPause_Click);
|
|
||||||
//
|
|
||||||
// buttonPlay
|
|
||||||
//
|
|
||||||
this.buttonPlay.BackColor = System.Drawing.Color.Transparent;
|
|
||||||
this.buttonPlay.BackgroundImage = global::CUEPlayer.Properties.Resources.control_play_blue;
|
|
||||||
this.buttonPlay.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center;
|
|
||||||
this.buttonPlay.FlatAppearance.BorderSize = 0;
|
|
||||||
this.buttonPlay.Location = new System.Drawing.Point(9, 130);
|
|
||||||
this.buttonPlay.Name = "buttonPlay";
|
|
||||||
this.buttonPlay.Size = new System.Drawing.Size(25, 25);
|
|
||||||
this.buttonPlay.TabIndex = 10;
|
|
||||||
this.buttonPlay.UseVisualStyleBackColor = false;
|
|
||||||
this.buttonPlay.Click += new System.EventHandler(this.buttonPlay_Click);
|
|
||||||
//
|
|
||||||
// buttonStop
|
|
||||||
//
|
|
||||||
this.buttonStop.Image = global::CUEPlayer.Properties.Resources.control_stop_blue;
|
|
||||||
this.buttonStop.Location = new System.Drawing.Point(34, 130);
|
|
||||||
this.buttonStop.Name = "buttonStop";
|
|
||||||
this.buttonStop.Size = new System.Drawing.Size(25, 25);
|
|
||||||
this.buttonStop.TabIndex = 11;
|
|
||||||
this.buttonStop.UseVisualStyleBackColor = true;
|
|
||||||
this.buttonStop.Click += new System.EventHandler(this.buttonStop_Click);
|
|
||||||
//
|
|
||||||
// timer1
|
// timer1
|
||||||
//
|
//
|
||||||
this.timer1.Enabled = true;
|
this.timer1.Enabled = true;
|
||||||
this.timer1.Interval = 50;
|
this.timer1.Interval = 50;
|
||||||
this.timer1.Tick += new System.EventHandler(this.timer1_Tick);
|
this.timer1.Tick += new System.EventHandler(this.timer1_Tick);
|
||||||
//
|
//
|
||||||
|
// checkBoxMute
|
||||||
|
//
|
||||||
|
this.checkBoxMute.Appearance = System.Windows.Forms.Appearance.Button;
|
||||||
|
this.checkBoxMute.Checked = true;
|
||||||
|
this.checkBoxMute.CheckState = System.Windows.Forms.CheckState.Checked;
|
||||||
|
this.checkBoxMute.DataBindings.Add(new System.Windows.Forms.Binding("Checked", this.outputBindingSource, "Muted", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||||
|
this.checkBoxMute.DataBindings.Add(new System.Windows.Forms.Binding("ImageIndex", this.outputBindingSource, "VolumeIcon", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||||
|
this.checkBoxMute.FlatAppearance.BorderSize = 0;
|
||||||
|
this.checkBoxMute.FlatAppearance.CheckedBackColor = System.Drawing.Color.Transparent;
|
||||||
|
this.checkBoxMute.FlatAppearance.MouseDownBackColor = System.Drawing.Color.Transparent;
|
||||||
|
this.checkBoxMute.FlatAppearance.MouseOverBackColor = System.Drawing.Color.Transparent;
|
||||||
|
this.checkBoxMute.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
|
||||||
|
this.checkBoxMute.ImageIndex = 0;
|
||||||
|
this.checkBoxMute.ImageList = this.imageList1;
|
||||||
|
this.checkBoxMute.Location = new System.Drawing.Point(16, 110);
|
||||||
|
this.checkBoxMute.Name = "checkBoxMute";
|
||||||
|
this.checkBoxMute.Size = new System.Drawing.Size(22, 22);
|
||||||
|
this.checkBoxMute.TabIndex = 15;
|
||||||
|
this.checkBoxMute.UseVisualStyleBackColor = true;
|
||||||
|
//
|
||||||
|
// imageList1
|
||||||
|
//
|
||||||
|
this.imageList1.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imageList1.ImageStream")));
|
||||||
|
this.imageList1.TransparentColor = System.Drawing.Color.Transparent;
|
||||||
|
this.imageList1.Images.SetKeyName(0, "sound_mute.png");
|
||||||
|
this.imageList1.Images.SetKeyName(1, "sound_none.png");
|
||||||
|
this.imageList1.Images.SetKeyName(2, "sound_low.png");
|
||||||
|
this.imageList1.Images.SetKeyName(3, "sound.png");
|
||||||
|
//
|
||||||
|
// outputBindingSource
|
||||||
|
//
|
||||||
|
this.outputBindingSource.DataSource = typeof(CUEPlayer.Output);
|
||||||
|
//
|
||||||
// Output
|
// Output
|
||||||
//
|
//
|
||||||
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(96, 168);
|
this.ClientSize = new System.Drawing.Size(74, 136);
|
||||||
this.ControlBox = false;
|
this.ControlBox = false;
|
||||||
|
this.Controls.Add(this.checkBoxMute);
|
||||||
this.Controls.Add(this.mediaSliderVolume);
|
this.Controls.Add(this.mediaSliderVolume);
|
||||||
this.Controls.Add(this.peakMeterCtrl1);
|
this.Controls.Add(this.peakMeterCtrl1);
|
||||||
this.Controls.Add(this.buttonPause);
|
|
||||||
this.Controls.Add(this.buttonPlay);
|
|
||||||
this.Controls.Add(this.buttonStop);
|
|
||||||
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow;
|
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow;
|
||||||
this.MaximizeBox = false;
|
this.MaximizeBox = false;
|
||||||
this.MinimizeBox = false;
|
this.MinimizeBox = false;
|
||||||
@@ -155,6 +155,7 @@
|
|||||||
this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide;
|
this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide;
|
||||||
this.Text = "Output";
|
this.Text = "Output";
|
||||||
this.Load += new System.EventHandler(this.Output_Load);
|
this.Load += new System.EventHandler(this.Output_Load);
|
||||||
|
((System.ComponentModel.ISupportInitialize)(this.outputBindingSource)).EndInit();
|
||||||
this.ResumeLayout(false);
|
this.ResumeLayout(false);
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -163,9 +164,9 @@
|
|||||||
|
|
||||||
private MediaSlider.MediaSlider mediaSliderVolume;
|
private MediaSlider.MediaSlider mediaSliderVolume;
|
||||||
private Ernzo.WinForms.Controls.PeakMeterCtrl peakMeterCtrl1;
|
private Ernzo.WinForms.Controls.PeakMeterCtrl peakMeterCtrl1;
|
||||||
private System.Windows.Forms.Button buttonPause;
|
|
||||||
private System.Windows.Forms.Button buttonPlay;
|
|
||||||
private System.Windows.Forms.Button buttonStop;
|
|
||||||
private System.Windows.Forms.Timer timer1;
|
private System.Windows.Forms.Timer timer1;
|
||||||
|
private System.Windows.Forms.CheckBox checkBoxMute;
|
||||||
|
private System.Windows.Forms.ImageList imageList1;
|
||||||
|
private System.Windows.Forms.BindingSource outputBindingSource;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -9,24 +9,39 @@ using System.Diagnostics;
|
|||||||
using NAudio.CoreAudioApi;
|
using NAudio.CoreAudioApi;
|
||||||
using CUETools.Codecs;
|
using CUETools.Codecs;
|
||||||
using CUETools.Codecs.CoreAudio;
|
using CUETools.Codecs.CoreAudio;
|
||||||
|
using CUETools.DSP.Resampler;
|
||||||
|
using CUETools.DSP.Mixer;
|
||||||
using CUETools.Processor;
|
using CUETools.Processor;
|
||||||
|
|
||||||
namespace CUEPlayer
|
namespace CUEPlayer
|
||||||
{
|
{
|
||||||
public partial class Output : Form
|
public partial class Output : Form
|
||||||
{
|
{
|
||||||
|
private IWavePlayer _player;
|
||||||
|
private AudioBuffer resampled;
|
||||||
|
private SOXResampler _resampler;
|
||||||
private MMDevice _device;
|
private MMDevice _device;
|
||||||
|
private DateTime _pauseTill;
|
||||||
|
private bool _muted;
|
||||||
|
|
||||||
internal MMDevice Device
|
public int VolumeIcon
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
return _device;
|
return _muted ? 0 : mediaSliderVolume.Value < 10 ? 1 : mediaSliderVolume.Value < 50 ? 2 : 3;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public bool Muted
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return _muted;
|
||||||
|
}
|
||||||
set
|
set
|
||||||
{
|
{
|
||||||
_device = value;
|
_muted = value;
|
||||||
|
_pauseTill = DateTime.Now;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -35,13 +50,73 @@ namespace CUEPlayer
|
|||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void Output_Load(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
peakMeterCtrl1.Start(50);
|
||||||
|
outputBindingSource.DataSource = this;
|
||||||
|
}
|
||||||
|
|
||||||
public void Init(frmCUEPlayer parent)
|
public void Init(frmCUEPlayer parent)
|
||||||
{
|
{
|
||||||
MdiParent = parent;
|
MdiParent = parent;
|
||||||
_device = WasapiOut.GetDefaultAudioEndpoint();
|
_device = WasapiOut.GetDefaultAudioEndpoint();
|
||||||
_device.AudioEndpointVolume.OnVolumeNotification += new AudioEndpointVolumeNotificationDelegate(AudioEndpointVolume_OnVolumeNotification);
|
_device.AudioEndpointVolume.OnVolumeNotification += new AudioEndpointVolumeNotificationDelegate(AudioEndpointVolume_OnVolumeNotification);
|
||||||
mediaSliderVolume.Value = (int)(_device.AudioEndpointVolume.MasterVolumeLevelScalar * 100);
|
mediaSliderVolume.Value = (int)(_device.AudioEndpointVolume.MasterVolumeLevelScalar * 100);
|
||||||
|
//mediaSliderVolume.Maximum = (int)(_device.AudioEndpointVolume.VolumeRange);
|
||||||
Show();
|
Show();
|
||||||
|
|
||||||
|
int delay = 100;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
_player = new WasapiOut(_device, NAudio.CoreAudioApi.AudioClientShareMode.Shared, true, delay, new AudioPCMConfig(32, 2, 44100));
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
_player = null;
|
||||||
|
}
|
||||||
|
if (_player == null)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
_player = new WasapiOut(_device, NAudio.CoreAudioApi.AudioClientShareMode.Shared, true, delay, new AudioPCMConfig(32, 2, 48000));
|
||||||
|
SOXResamplerConfig cfg;
|
||||||
|
cfg.quality = SOXResamplerQuality.Very;
|
||||||
|
cfg.phase = 50;
|
||||||
|
cfg.allow_aliasing = false;
|
||||||
|
cfg.bandwidth = 0;
|
||||||
|
_resampler = new SOXResampler(parent.Mixer.PCM, _player.PCM, cfg);
|
||||||
|
resampled = new AudioBuffer(_player.PCM, parent.Mixer.BufferSize * 2 * parent.Mixer.PCM.SampleRate / _player.PCM.SampleRate);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
_player = null;
|
||||||
|
Trace.WriteLine(ex.Message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
parent.Mixer.AudioRead += new EventHandler<AudioReadEventArgs>(Mixer_AudioRead);
|
||||||
|
if (_player != null)
|
||||||
|
_player.Play();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Mixer_AudioRead(object sender, AudioReadEventArgs e)
|
||||||
|
{
|
||||||
|
if (_muted || _player == null)
|
||||||
|
{
|
||||||
|
double tosleep = (_pauseTill - DateTime.Now).TotalMilliseconds;
|
||||||
|
if (tosleep > 0) System.Threading.Thread.Sleep((int)tosleep);
|
||||||
|
_pauseTill = DateTime.Now.AddMilliseconds(1000 * e.buffer.Length / e.buffer.PCM.SampleRate);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (_resampler == null)
|
||||||
|
_player.Write(e.buffer);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//Trace.WriteLine(string.Format("Flow: {0}", result.Length));
|
||||||
|
_resampler.Flow(e.buffer, resampled);
|
||||||
|
//Trace.WriteLine(string.Format("Play: {0}", resampled.Length));
|
||||||
|
if (resampled.Length != 0)
|
||||||
|
_player.Write(resampled);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void AudioEndpointVolume_OnVolumeNotification(AudioVolumeNotificationData data)
|
void AudioEndpointVolume_OnVolumeNotification(AudioVolumeNotificationData data)
|
||||||
@@ -51,13 +126,17 @@ namespace CUEPlayer
|
|||||||
if (this.InvokeRequired)
|
if (this.InvokeRequired)
|
||||||
this.Invoke((MethodInvoker)delegate() { AudioEndpointVolume_OnVolumeNotification(data); });
|
this.Invoke((MethodInvoker)delegate() { AudioEndpointVolume_OnVolumeNotification(data); });
|
||||||
else
|
else
|
||||||
|
{
|
||||||
mediaSliderVolume.Value = (int)(data.MasterVolume * 100);
|
mediaSliderVolume.Value = (int)(data.MasterVolume * 100);
|
||||||
|
outputBindingSource.ResetBindings(false);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void mediaSliderVolume_Scrolled(object sender, EventArgs e)
|
private void mediaSliderVolume_Scrolled(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
outputBindingSource.ResetBindings(false);
|
||||||
_device.AudioEndpointVolume.MasterVolumeLevelScalar = mediaSliderVolume.Value / 100.0f;
|
_device.AudioEndpointVolume.MasterVolumeLevelScalar = mediaSliderVolume.Value / 100.0f;
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
@@ -82,25 +161,5 @@ namespace CUEPlayer
|
|||||||
//peakValues[0] = (int)(_device.AudioMeterInformation.MasterPeakValue * 100);
|
//peakValues[0] = (int)(_device.AudioMeterInformation.MasterPeakValue * 100);
|
||||||
peakMeterCtrl1.SetData(peakValues, 0, peakValues.Length);
|
peakMeterCtrl1.SetData(peakValues, 0, peakValues.Length);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void buttonPlay_Click(object sender, EventArgs e)
|
|
||||||
{
|
|
||||||
(MdiParent as frmCUEPlayer).buttonPlay_Click(sender, e);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void buttonStop_Click(object sender, EventArgs e)
|
|
||||||
{
|
|
||||||
(MdiParent as frmCUEPlayer).buttonStop_Click(sender, e);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void buttonPause_Click(object sender, EventArgs e)
|
|
||||||
{
|
|
||||||
(MdiParent as frmCUEPlayer).buttonPause_Click(sender, e);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void Output_Load(object sender, EventArgs e)
|
|
||||||
{
|
|
||||||
peakMeterCtrl1.Start(50);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -120,4 +120,63 @@
|
|||||||
<metadata name="timer1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
<metadata name="timer1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||||
<value>17, 17</value>
|
<value>17, 17</value>
|
||||||
</metadata>
|
</metadata>
|
||||||
|
<metadata name="outputBindingSource.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||||
|
<value>214, 17</value>
|
||||||
|
</metadata>
|
||||||
|
<metadata name="imageList1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||||
|
<value>104, 17</value>
|
||||||
|
</metadata>
|
||||||
|
<data name="imageList1.ImageStream" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||||
|
<value>
|
||||||
|
AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w
|
||||||
|
LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
|
||||||
|
ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAC0
|
||||||
|
CgAAAk1TRnQBSQFMAgEBBAEAAQwBAAEEAQABEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo
|
||||||
|
AwABQAMAASADAAEBAQABCAYAAQgYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA
|
||||||
|
AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5
|
||||||
|
AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA
|
||||||
|
AWYDAAGZAwABzAIAATMDAAIzAgABMwFmAgABMwGZAgABMwHMAgABMwH/AgABZgMAAWYBMwIAAmYCAAFm
|
||||||
|
AZkCAAFmAcwCAAFmAf8CAAGZAwABmQEzAgABmQFmAgACmQIAAZkBzAIAAZkB/wIAAcwDAAHMATMCAAHM
|
||||||
|
AWYCAAHMAZkCAALMAgABzAH/AgAB/wFmAgAB/wGZAgAB/wHMAQABMwH/AgAB/wEAATMBAAEzAQABZgEA
|
||||||
|
ATMBAAGZAQABMwEAAcwBAAEzAQAB/wEAAf8BMwIAAzMBAAIzAWYBAAIzAZkBAAIzAcwBAAIzAf8BAAEz
|
||||||
|
AWYCAAEzAWYBMwEAATMCZgEAATMBZgGZAQABMwFmAcwBAAEzAWYB/wEAATMBmQIAATMBmQEzAQABMwGZ
|
||||||
|
AWYBAAEzApkBAAEzAZkBzAEAATMBmQH/AQABMwHMAgABMwHMATMBAAEzAcwBZgEAATMBzAGZAQABMwLM
|
||||||
|
AQABMwHMAf8BAAEzAf8BMwEAATMB/wFmAQABMwH/AZkBAAEzAf8BzAEAATMC/wEAAWYDAAFmAQABMwEA
|
||||||
|
AWYBAAFmAQABZgEAAZkBAAFmAQABzAEAAWYBAAH/AQABZgEzAgABZgIzAQABZgEzAWYBAAFmATMBmQEA
|
||||||
|
AWYBMwHMAQABZgEzAf8BAAJmAgACZgEzAQADZgEAAmYBmQEAAmYBzAEAAWYBmQIAAWYBmQEzAQABZgGZ
|
||||||
|
AWYBAAFmApkBAAFmAZkBzAEAAWYBmQH/AQABZgHMAgABZgHMATMBAAFmAcwBmQEAAWYCzAEAAWYBzAH/
|
||||||
|
AQABZgH/AgABZgH/ATMBAAFmAf8BmQEAAWYB/wHMAQABzAEAAf8BAAH/AQABzAEAApkCAAGZATMBmQEA
|
||||||
|
AZkBAAGZAQABmQEAAcwBAAGZAwABmQIzAQABmQEAAWYBAAGZATMBzAEAAZkBAAH/AQABmQFmAgABmQFm
|
||||||
|
ATMBAAGZATMBZgEAAZkBZgGZAQABmQFmAcwBAAGZATMB/wEAApkBMwEAApkBZgEAA5kBAAKZAcwBAAKZ
|
||||||
|
Af8BAAGZAcwCAAGZAcwBMwEAAWYBzAFmAQABmQHMAZkBAAGZAswBAAGZAcwB/wEAAZkB/wIAAZkB/wEz
|
||||||
|
AQABmQHMAWYBAAGZAf8BmQEAAZkB/wHMAQABmQL/AQABzAMAAZkBAAEzAQABzAEAAWYBAAHMAQABmQEA
|
||||||
|
AcwBAAHMAQABmQEzAgABzAIzAQABzAEzAWYBAAHMATMBmQEAAcwBMwHMAQABzAEzAf8BAAHMAWYCAAHM
|
||||||
|
AWYBMwEAAZkCZgEAAcwBZgGZAQABzAFmAcwBAAGZAWYB/wEAAcwBmQIAAcwBmQEzAQABzAGZAWYBAAHM
|
||||||
|
ApkBAAHMAZkBzAEAAcwBmQH/AQACzAIAAswBMwEAAswBZgEAAswBmQEAA8wBAALMAf8BAAHMAf8CAAHM
|
||||||
|
Af8BMwEAAZkB/wFmAQABzAH/AZkBAAHMAf8BzAEAAcwC/wEAAcwBAAEzAQAB/wEAAWYBAAH/AQABmQEA
|
||||||
|
AcwBMwIAAf8CMwEAAf8BMwFmAQAB/wEzAZkBAAH/ATMBzAEAAf8BMwH/AQAB/wFmAgAB/wFmATMBAAHM
|
||||||
|
AmYBAAH/AWYBmQEAAf8BZgHMAQABzAFmAf8BAAH/AZkCAAH/AZkBMwEAAf8BmQFmAQAB/wKZAQAB/wGZ
|
||||||
|
AcwBAAH/AZkB/wEAAf8BzAIAAf8BzAEzAQAB/wHMAWYBAAH/AcwBmQEAAf8CzAEAAf8BzAH/AQAC/wEz
|
||||||
|
AQABzAH/AWYBAAL/AZkBAAL/AcwBAAJmAf8BAAFmAf8BZgEAAWYC/wEAAf8CZgEAAf8BZgH/AQAC/wFm
|
||||||
|
AQABIQEAAaUBAANfAQADdwEAA4YBAAOWAQADywEAA7IBAAPXAQAD3QEAA+MBAAPqAQAD8QEAA/gBAAHw
|
||||||
|
AfsB/wEAAaQCoAEAA4ADAAH/AgAB/wMAAv8BAAH/AwAB/wEAAf8BAAL/AgAD//8A/wD/AP8AiQAB9AH/
|
||||||
|
BAAB8gHsCgAB8gH4DgAB8gH4DgAB8gHsCwAB/wHjAZQB/wEAAf8BvAJtCAAB/wG8Am0MAAH/AbwCbQwA
|
||||||
|
Af8BvAJtBQABvQH/BQABBwHjARYB8wHsAW0B6wFtBAAD9AHzAewBbQHrAW0IAAP0AfMB7AFtAesBbQQA
|
||||||
|
Af8DAAP0AfMB7AFtAesBbQQAAb0BRwFvBQAB6wFvARcBbwHrARIB6gFtBAAC6wNtARIB6gFtCAAC6wNt
|
||||||
|
ARIB6gFtAwABGgH/AwAC6wNtARIB6gFtAwABGgH/AUYBRwEaBAAB7AGSAW8BFwFGARQB6gFtBAAB+AGS
|
||||||
|
AesBbQESARUB6gFtCAAB+AGSAesBbQESARUB6gFtAgABGgEXARoB/wIAAewBkgHrAW0BEgEVAeoBbQIA
|
||||||
|
ARoBFwIaAUcBbwQAAewBkgFtAW4BFwFGAm0EAAHsAZIBbQHqARIBEwJtCAAB7AGSAW0B6gESARMCbQEA
|
||||||
|
AeMB9AIXAwAB7AGSAW0B6gESARMCbQEAAeMB9AIXAQACRgQAAewB9wLsAW8BFwFvAesEAAHsAfcC7AH4
|
||||||
|
AesB7AFtCAAB7AH3AuwB+AHrAewBbQEAARYB9AHjARcDAAHsAfcD7AHrAewBbQEAARYB9AHjARcBAAEX
|
||||||
|
AUYEAAHsAwcBkgFvARcBbwH/AwAB7AMHAZIB7AHtAesIAAHsAwcBkgHsAe0B6wIAARsB4wEaAf8CAAHs
|
||||||
|
AwcBkgHsAe0B6wIAARsB4wIaARcBFgQAAewD7QH3Ae8BbwEXAZQDAAHsA+0B9wHvAfcB6wgAAewD7QH3
|
||||||
|
Ae8B9wHrAwABGwH/AwAB7APtAfcB7wH3AesDAAEbAf8BbwHjARoEAAT0AfcBkgHvAW8BFgH/AgAE9AH3
|
||||||
|
AZIB7wH4CAAE9AH3AZIB7wH4BAAB/wMABPQB9wGSAe8B7AQAARoB4wGTCQAB/wHwAuwBGgH/BgAB/wHw
|
||||||
|
AuwMAAH/AfAC7AwAAf8B8ALsBQABGwH/CwAB8gGSCgAB8gGSDgAB8gGSDgAB8gGSiAABQgFNAT4HAAE+
|
||||||
|
AwABKAMAAUADAAEgAwABAQEAAQEGAAEBFgAD/4EAEP8B8wHPAfwB/wH8Af8B/AH/AeEBDwHwAf8B8AH/
|
||||||
|
AfAB+QHwAQ8BAAH/AQAB9wEAAfEB8AEPAQAB/wEAAecBAAHgAfABDwEAAf8BAAHDAQABwAHwAQ8BAAH/
|
||||||
|
AQABhwEAAYQB8AEPAQAB/wEAAYcBAAGEAfABBwEAAf8BAAHDAQABwAHwAQcBAAH/AQAB5wEAAeAB8AED
|
||||||
|
AQAB/wEAAfcBAAHxAf8BAwHwAf8B8AH/AfAB+QH/Ac8B/AH/AfwB/wH8Ef8L
|
||||||
|
</value>
|
||||||
|
</data>
|
||||||
</root>
|
</root>
|
||||||
1
CUEPlayer/Playlist.Designer.cs
generated
@@ -104,6 +104,7 @@
|
|||||||
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.SizableToolWindow;
|
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.SizableToolWindow;
|
||||||
this.Name = "Playlist";
|
this.Name = "Playlist";
|
||||||
this.Text = "Playlist";
|
this.Text = "Playlist";
|
||||||
|
this.Load += new System.EventHandler(this.Playlist_Load);
|
||||||
this.contextMenuStripPlaylist.ResumeLayout(false);
|
this.contextMenuStripPlaylist.ResumeLayout(false);
|
||||||
this.ResumeLayout(false);
|
this.ResumeLayout(false);
|
||||||
|
|
||||||
|
|||||||
@@ -33,8 +33,17 @@ namespace CUEPlayer
|
|||||||
_icon_mgr = parent.IconMgr;
|
_icon_mgr = parent.IconMgr;
|
||||||
listViewTracks.SmallImageList = _icon_mgr.ImageList;
|
listViewTracks.SmallImageList = _icon_mgr.ImageList;
|
||||||
foreach (DataSet1.PlaylistRow row in dataSet.Playlist)
|
foreach (DataSet1.PlaylistRow row in dataSet.Playlist)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
listViewTracks.Items.Add(ToItem(row));
|
listViewTracks.Items.Add(ToItem(row));
|
||||||
}
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Trace.WriteLine(ex.Message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public ListView List
|
public ListView List
|
||||||
{
|
{
|
||||||
@@ -161,5 +170,10 @@ namespace CUEPlayer
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void Playlist_Load(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,9 +8,9 @@ using System.Runtime.InteropServices;
|
|||||||
[assembly: AssemblyTitle("CUEPlayer")]
|
[assembly: AssemblyTitle("CUEPlayer")]
|
||||||
[assembly: AssemblyDescription("")]
|
[assembly: AssemblyDescription("")]
|
||||||
[assembly: AssemblyConfiguration("")]
|
[assembly: AssemblyConfiguration("")]
|
||||||
[assembly: AssemblyCompany("Microsoft")]
|
[assembly: AssemblyCompany("CUETools")]
|
||||||
[assembly: AssemblyProduct("CUEPlayer")]
|
[assembly: AssemblyProduct("CUEPlayer")]
|
||||||
[assembly: AssemblyCopyright("Copyright © Microsoft 2010")]
|
[assembly: AssemblyCopyright("Copyright © Gregory S. Chudov 2010")]
|
||||||
[assembly: AssemblyTrademark("")]
|
[assembly: AssemblyTrademark("")]
|
||||||
[assembly: AssemblyCulture("")]
|
[assembly: AssemblyCulture("")]
|
||||||
|
|
||||||
@@ -32,5 +32,5 @@ using System.Runtime.InteropServices;
|
|||||||
// You can specify all the values or you can default the Build and Revision Numbers
|
// You can specify all the values or you can default the Build and Revision Numbers
|
||||||
// by using the '*' as shown below:
|
// by using the '*' as shown below:
|
||||||
// [assembly: AssemblyVersion("1.0.*")]
|
// [assembly: AssemblyVersion("1.0.*")]
|
||||||
[assembly: AssemblyVersion("1.0.0.0")]
|
[assembly: AssemblyVersion("2.0.7.0")]
|
||||||
[assembly: AssemblyFileVersion("1.0.0.0")]
|
[assembly: AssemblyFileVersion("2.0.7.0")]
|
||||||
|
|||||||
@@ -6,5 +6,5 @@
|
|||||||
cause the file to be unrecognizable by the program.
|
cause the file to be unrecognizable by the program.
|
||||||
-->
|
-->
|
||||||
<GenericObjectDataSource DisplayName="frmCUEPlayer" Version="1.0" xmlns="urn:schemas-microsoft-com:xml-msdatasource">
|
<GenericObjectDataSource DisplayName="frmCUEPlayer" Version="1.0" xmlns="urn:schemas-microsoft-com:xml-msdatasource">
|
||||||
<TypeInfo>CUEPlayer.frmCUEPlayer, CUEPlayer, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null</TypeInfo>
|
<TypeInfo>CUEPlayer.frmCUEPlayer, CUEPlayer, Version=2.0.7.0, Culture=neutral, PublicKeyToken=null</TypeInfo>
|
||||||
</GenericObjectDataSource>
|
</GenericObjectDataSource>
|
||||||
28
CUEPlayer/Properties/Resources.Designer.cs
generated
@@ -60,6 +60,13 @@ namespace CUEPlayer.Properties {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
internal static System.Drawing.Bitmap cog {
|
||||||
|
get {
|
||||||
|
object obj = ResourceManager.GetObject("cog", resourceCulture);
|
||||||
|
return ((System.Drawing.Bitmap)(obj));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
internal static System.Drawing.Bitmap control_eject {
|
internal static System.Drawing.Bitmap control_eject {
|
||||||
get {
|
get {
|
||||||
object obj = ResourceManager.GetObject("control_eject", resourceCulture);
|
object obj = ResourceManager.GetObject("control_eject", resourceCulture);
|
||||||
@@ -143,5 +150,26 @@ namespace CUEPlayer.Properties {
|
|||||||
return ((System.Drawing.Bitmap)(obj));
|
return ((System.Drawing.Bitmap)(obj));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
internal static System.Drawing.Bitmap sound {
|
||||||
|
get {
|
||||||
|
object obj = ResourceManager.GetObject("sound", resourceCulture);
|
||||||
|
return ((System.Drawing.Bitmap)(obj));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
internal static System.Drawing.Bitmap sound_mute {
|
||||||
|
get {
|
||||||
|
object obj = ResourceManager.GetObject("sound_mute", resourceCulture);
|
||||||
|
return ((System.Drawing.Bitmap)(obj));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
internal static System.Drawing.Bitmap transmit_blue {
|
||||||
|
get {
|
||||||
|
object obj = ResourceManager.GetObject("transmit_blue", resourceCulture);
|
||||||
|
return ((System.Drawing.Bitmap)(obj));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -118,8 +118,8 @@
|
|||||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
|
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
|
||||||
<data name="control_eject_blue" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
<data name="ctdb" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
<value>..\Resources\control_eject_blue.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
<value>..\Resources\ctdb.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="control_fastforward_blue" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
<data name="control_fastforward_blue" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
<value>..\Resources\control_fastforward_blue.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
<value>..\Resources\control_fastforward_blue.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||||
@@ -130,20 +130,32 @@
|
|||||||
<data name="control_eject" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
<data name="control_eject" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
<value>..\Resources\control_eject.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
<value>..\Resources\control_eject.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="control_end_blue" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
<data name="control_eject_blue" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
<value>..\Resources\control_end_blue.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
<value>..\Resources\control_eject_blue.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||||
|
</data>
|
||||||
|
<data name="control_stop_blue" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
|
<value>..\Resources\control_stop_blue.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||||
|
</data>
|
||||||
|
<data name="sound_mute" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
|
<value>..\Resources\sound_mute.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="control_repeat_blue" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
<data name="control_repeat_blue" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
<value>..\Resources\control_repeat_blue.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
<value>..\Resources\control_repeat_blue.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="sound" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
|
<value>..\Resources\sound.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||||
|
</data>
|
||||||
<data name="control_rewind_blue" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
<data name="control_rewind_blue" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
<value>..\Resources\control_rewind_blue.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
<value>..\Resources\control_rewind_blue.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="transmit_blue" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
|
<value>..\Resources\transmit_blue.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||||
|
</data>
|
||||||
<data name="control_pause_blue" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
<data name="control_pause_blue" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
<value>..\Resources\control_pause_blue.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
<value>..\Resources\control_pause_blue.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="control_stop_blue" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
<data name="control_end_blue" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
<value>..\Resources\control_stop_blue.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
<value>..\Resources\control_end_blue.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="control_play_blue" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
<data name="control_play_blue" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
<value>..\Resources\control_play_blue.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
<value>..\Resources\control_play_blue.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||||
@@ -151,7 +163,7 @@
|
|||||||
<data name="control_equalizer_blue" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
<data name="control_equalizer_blue" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
<value>..\Resources\control_equalizer_blue.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
<value>..\Resources\control_equalizer_blue.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ctdb" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
<data name="cog" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
<value>..\Resources\ctdb.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
<value>..\Resources\cog.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||||
</data>
|
</data>
|
||||||
</root>
|
</root>
|
||||||
22
CUEPlayer/Properties/Settings.Designer.cs
generated
@@ -32,5 +32,27 @@ namespace CUEPlayer.Properties {
|
|||||||
return ((string)(this["CUEPlayerConnectionString"]));
|
return ((string)(this["CUEPlayerConnectionString"]));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||||
|
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||||
|
public global::CUETools.Codecs.Icecast.IcecastSettingsData IcecastSettings {
|
||||||
|
get {
|
||||||
|
return ((global::CUETools.Codecs.Icecast.IcecastSettingsData)(this["IcecastSettings"]));
|
||||||
|
}
|
||||||
|
set {
|
||||||
|
this["IcecastSettings"] = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||||
|
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||||
|
public global::CUEPlayer.CUEPlayerSettings AppSettings {
|
||||||
|
get {
|
||||||
|
return ((global::CUEPlayer.CUEPlayerSettings)(this["AppSettings"]));
|
||||||
|
}
|
||||||
|
set {
|
||||||
|
this["AppSettings"] = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,5 +10,11 @@
|
|||||||
</SerializableConnectionString></DesignTimeValue>
|
</SerializableConnectionString></DesignTimeValue>
|
||||||
<Value Profile="(Default)">Data Source=|DataDirectory|\CUEPlayer.sdf</Value>
|
<Value Profile="(Default)">Data Source=|DataDirectory|\CUEPlayer.sdf</Value>
|
||||||
</Setting>
|
</Setting>
|
||||||
|
<Setting Name="IcecastSettings" Type="CUETools.Codecs.Icecast.IcecastSettingsData" Scope="User">
|
||||||
|
<Value Profile="(Default)" />
|
||||||
|
</Setting>
|
||||||
|
<Setting Name="AppSettings" Type="CUEPlayer.CUEPlayerSettings" Scope="User">
|
||||||
|
<Value Profile="(Default)" />
|
||||||
|
</Setting>
|
||||||
</Settings>
|
</Settings>
|
||||||
</SettingsFile>
|
</SettingsFile>
|
||||||
BIN
CUEPlayer/Resources/cog.png
Normal file
|
After Width: | Height: | Size: 512 B |
BIN
CUEPlayer/Resources/sound.png
Normal file
|
After Width: | Height: | Size: 610 B |
BIN
CUEPlayer/Resources/sound_low.png
Normal file
|
After Width: | Height: | Size: 524 B |
BIN
CUEPlayer/Resources/sound_mute.png
Normal file
|
After Width: | Height: | Size: 474 B |
BIN
CUEPlayer/Resources/sound_none.png
Normal file
|
After Width: | Height: | Size: 417 B |
BIN
CUEPlayer/Resources/transmit_blue.ico
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
BIN
CUEPlayer/Resources/transmit_blue.png
Normal file
|
After Width: | Height: | Size: 814 B |
28
CUEPlayer/Settings.cs
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
namespace CUEPlayer.Properties {
|
||||||
|
|
||||||
|
|
||||||
|
// This class allows you to handle specific events on the settings class:
|
||||||
|
// The SettingChanging event is raised before a setting's value is changed.
|
||||||
|
// The PropertyChanged event is raised after a setting's value is changed.
|
||||||
|
// The SettingsLoaded event is raised after the setting values are loaded.
|
||||||
|
// The SettingsSaving event is raised before the setting values are saved.
|
||||||
|
internal sealed partial class Settings {
|
||||||
|
|
||||||
|
public Settings() {
|
||||||
|
// // To add event handlers for saving and changing settings, uncomment the lines below:
|
||||||
|
//
|
||||||
|
// this.SettingChanging += this.SettingChangingEventHandler;
|
||||||
|
//
|
||||||
|
// this.SettingsSaving += this.SettingsSavingEventHandler;
|
||||||
|
//
|
||||||
|
}
|
||||||
|
|
||||||
|
private void SettingChangingEventHandler(object sender, System.Configuration.SettingChangingEventArgs e) {
|
||||||
|
// Add code to handle the SettingChangingEvent event here.
|
||||||
|
}
|
||||||
|
|
||||||
|
private void SettingsSavingEventHandler(object sender, System.ComponentModel.CancelEventArgs e) {
|
||||||
|
// Add code to handle the SettingsSaving event here.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -7,4 +7,9 @@
|
|||||||
connectionString="Data Source=|DataDirectory|\CUEPlayer.sdf"
|
connectionString="Data Source=|DataDirectory|\CUEPlayer.sdf"
|
||||||
providerName="Microsoft.SqlServerCe.Client.3.5" />
|
providerName="Microsoft.SqlServerCe.Client.3.5" />
|
||||||
</connectionStrings>
|
</connectionStrings>
|
||||||
|
<runtime>
|
||||||
|
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
|
||||||
|
<probing privatePath="plugins (x64)"/>
|
||||||
|
</assemblyBinding>
|
||||||
|
</runtime>
|
||||||
</configuration>
|
</configuration>
|
||||||
40
CUEPlayer/frmCUEPlayer.Designer.cs
generated
@@ -28,24 +28,62 @@
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
private void InitializeComponent()
|
private void InitializeComponent()
|
||||||
{
|
{
|
||||||
|
this.menuStrip1 = new System.Windows.Forms.MenuStrip();
|
||||||
|
this.windowsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
|
this.icecastToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
|
this.menuStrip1.SuspendLayout();
|
||||||
this.SuspendLayout();
|
this.SuspendLayout();
|
||||||
//
|
//
|
||||||
|
// menuStrip1
|
||||||
|
//
|
||||||
|
this.menuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
|
||||||
|
this.windowsToolStripMenuItem});
|
||||||
|
this.menuStrip1.Location = new System.Drawing.Point(0, 0);
|
||||||
|
this.menuStrip1.Name = "menuStrip1";
|
||||||
|
this.menuStrip1.Size = new System.Drawing.Size(1200, 24);
|
||||||
|
this.menuStrip1.TabIndex = 1;
|
||||||
|
this.menuStrip1.Text = "menuStrip1";
|
||||||
|
//
|
||||||
|
// windowsToolStripMenuItem
|
||||||
|
//
|
||||||
|
this.windowsToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
|
||||||
|
this.icecastToolStripMenuItem});
|
||||||
|
this.windowsToolStripMenuItem.Name = "windowsToolStripMenuItem";
|
||||||
|
this.windowsToolStripMenuItem.Size = new System.Drawing.Size(68, 20);
|
||||||
|
this.windowsToolStripMenuItem.Text = "Windows";
|
||||||
|
//
|
||||||
|
// icecastToolStripMenuItem
|
||||||
|
//
|
||||||
|
this.icecastToolStripMenuItem.Name = "icecastToolStripMenuItem";
|
||||||
|
this.icecastToolStripMenuItem.Size = new System.Drawing.Size(152, 22);
|
||||||
|
this.icecastToolStripMenuItem.Text = "Icecast";
|
||||||
|
this.icecastToolStripMenuItem.Click += new System.EventHandler(this.icecastToolStripMenuItem_Click);
|
||||||
|
//
|
||||||
// frmCUEPlayer
|
// frmCUEPlayer
|
||||||
//
|
//
|
||||||
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(1200, 477);
|
this.ClientSize = new System.Drawing.Size(1200, 474);
|
||||||
|
this.Controls.Add(this.menuStrip1);
|
||||||
this.IsMdiContainer = true;
|
this.IsMdiContainer = true;
|
||||||
|
this.MainMenuStrip = this.menuStrip1;
|
||||||
this.Name = "frmCUEPlayer";
|
this.Name = "frmCUEPlayer";
|
||||||
this.Text = "CUEPlayer 2.0.7";
|
this.Text = "CUEPlayer 2.0.7";
|
||||||
this.Load += new System.EventHandler(this.frmCUEPlayer_Load);
|
this.Load += new System.EventHandler(this.frmCUEPlayer_Load);
|
||||||
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.frmCUEPlayer_FormClosing);
|
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.frmCUEPlayer_FormClosing);
|
||||||
|
this.menuStrip1.ResumeLayout(false);
|
||||||
|
this.menuStrip1.PerformLayout();
|
||||||
this.ResumeLayout(false);
|
this.ResumeLayout(false);
|
||||||
|
this.PerformLayout();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
private System.Windows.Forms.MenuStrip menuStrip1;
|
||||||
|
private System.Windows.Forms.ToolStripMenuItem windowsToolStripMenuItem;
|
||||||
|
private System.Windows.Forms.ToolStripMenuItem icecastToolStripMenuItem;
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -8,12 +8,9 @@ using System.IO;
|
|||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
using NAudio.CoreAudioApi;
|
|
||||||
using CUEControls;
|
using CUEControls;
|
||||||
using CUETools.Codecs;
|
using CUETools.Codecs;
|
||||||
using CUETools.Codecs.CoreAudio;
|
|
||||||
using CUETools.DSP.Mixer;
|
using CUETools.DSP.Mixer;
|
||||||
using CUETools.DSP.Resampler;
|
|
||||||
using CUETools.Processor;
|
using CUETools.Processor;
|
||||||
|
|
||||||
namespace CUEPlayer
|
namespace CUEPlayer
|
||||||
@@ -22,12 +19,10 @@ namespace CUEPlayer
|
|||||||
{
|
{
|
||||||
private ShellIconMgr _icon_mgr;
|
private ShellIconMgr _icon_mgr;
|
||||||
private CUEConfig _config;
|
private CUEConfig _config;
|
||||||
private IWavePlayer _player;
|
|
||||||
DataSet1TableAdapters.PlaylistTableAdapter adapterPlayList = new DataSet1TableAdapters.PlaylistTableAdapter();
|
DataSet1TableAdapters.PlaylistTableAdapter adapterPlayList = new DataSet1TableAdapters.PlaylistTableAdapter();
|
||||||
private DataSet1 dataSet = new DataSet1();
|
private DataSet1 dataSet = new DataSet1();
|
||||||
private Thread mixThread;
|
private Thread mixThread;
|
||||||
private MixingSource _mixer;
|
private MixingSource _mixer;
|
||||||
private SOXResampler _resampler;
|
|
||||||
|
|
||||||
internal Playlist wndPlaylist
|
internal Playlist wndPlaylist
|
||||||
{
|
{
|
||||||
@@ -85,60 +80,36 @@ namespace CUEPlayer
|
|||||||
|
|
||||||
private void frmCUEPlayer_Load(object sender, EventArgs e)
|
private void frmCUEPlayer_Load(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
int delay = 100;
|
if (Properties.Settings.Default.AppSettings == null)
|
||||||
AudioPCMConfig mixerPCM = AudioPCMConfig.RedBook;
|
{
|
||||||
|
Properties.Settings.Default.AppSettings = new CUEPlayerSettings();
|
||||||
|
Properties.Settings.Default.AppSettings.IcecastServers.Add(new CUETools.Codecs.Icecast.IcecastSettingsData());
|
||||||
|
}
|
||||||
|
|
||||||
//System.Data.SqlServerCe.SqlCeDataAdapter ad = new System.Data.SqlServerCe.SqlCeDataAdapter();
|
//System.Data.SqlServerCe.SqlCeDataAdapter ad = new System.Data.SqlServerCe.SqlCeDataAdapter();
|
||||||
//ad.SelectCommand = new System.Data.SqlServerCe.SqlCeCommand("SELECT * FROM Playlist WHERE track=1", adapterPlayList.Connection);
|
//ad.SelectCommand = new System.Data.SqlServerCe.SqlCeCommand("SELECT * FROM Playlist WHERE track=1", adapterPlayList.Connection);
|
||||||
//ad.Fill(dataSet.Playlist);
|
//ad.Fill(dataSet.Playlist);
|
||||||
adapterPlayList.Fill(dataSet.Playlist);
|
adapterPlayList.Fill(dataSet.Playlist);
|
||||||
|
|
||||||
_mixer = new MixingSource(mixerPCM, delay, 2);
|
_mixer = new MixingSource(new AudioPCMConfig(32, 2, 44100), 100, 2);
|
||||||
|
|
||||||
outputA.Init(this);
|
outputA.Init(this);
|
||||||
browser.Init(this);
|
browser.Init(this);
|
||||||
playlist.Init(this);
|
playlist.Init(this);
|
||||||
deckB.Init(this, null);
|
deckB.Init(this, null);
|
||||||
deckA.Init(this, deckB);
|
deckA.Init(this, deckB);
|
||||||
|
Icecast icecast = new Icecast();
|
||||||
|
icecast.Init(this);
|
||||||
//LayoutMdi(MdiLayout.TileHorizontal);
|
//LayoutMdi(MdiLayout.TileHorizontal);
|
||||||
|
|
||||||
browser.Location = new Point(0, 0);
|
browser.Location = new Point(0, 0);
|
||||||
browser.Height = ClientRectangle.Height - 5;
|
browser.Height = ClientRectangle.Height - 5 - menuStrip1.Height;
|
||||||
playlist.Location = new Point(browser.Location.X + browser.Width, 0);
|
playlist.Location = new Point(browser.Location.X + browser.Width, 0);
|
||||||
playlist.Height = ClientRectangle.Height - 5;
|
playlist.Height = ClientRectangle.Height - 5 - menuStrip1.Height;
|
||||||
deckA.Location = new Point(playlist.Location.X + playlist.Width, 0);
|
deckA.Location = new Point(playlist.Location.X + playlist.Width, 0);
|
||||||
deckB.Location = new Point(playlist.Location.X + playlist.Width, deckA.Height);
|
deckB.Location = new Point(playlist.Location.X + playlist.Width, deckA.Height);
|
||||||
outputA.Location = new Point(deckA.Location.X + deckA.Width, 0);
|
outputA.Location = new Point(deckA.Location.X + deckA.Width, 0);
|
||||||
|
icecast.Location = new Point(deckA.Location.X + deckA.Width, outputA.Height);
|
||||||
try
|
|
||||||
{
|
|
||||||
_player = new WasapiOut(outputA.Device, NAudio.CoreAudioApi.AudioClientShareMode.Shared, true, delay, new AudioPCMConfig(32, 2, 44100));
|
|
||||||
}
|
|
||||||
catch
|
|
||||||
{
|
|
||||||
_player = null;
|
|
||||||
}
|
|
||||||
if (_player == null)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
_player = new WasapiOut(outputA.Device, NAudio.CoreAudioApi.AudioClientShareMode.Shared, true, delay, new AudioPCMConfig(32, 2, 48000));
|
|
||||||
SOXResamplerConfig cfg;
|
|
||||||
cfg.quality = SOXResamplerQuality.Very;
|
|
||||||
cfg.phase = 50;
|
|
||||||
cfg.allow_aliasing = false;
|
|
||||||
cfg.bandwidth = 0;
|
|
||||||
_resampler = new SOXResampler(mixerPCM, _player.PCM, cfg);
|
|
||||||
}
|
|
||||||
catch(Exception ex)
|
|
||||||
{
|
|
||||||
_player = null;
|
|
||||||
Trace.WriteLine(ex.Message);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (_player != null)
|
|
||||||
{
|
|
||||||
_player.Play();
|
|
||||||
|
|
||||||
mixThread = new Thread(MixThread);
|
mixThread = new Thread(MixThread);
|
||||||
mixThread.Priority = ThreadPriority.AboveNormal;
|
mixThread.Priority = ThreadPriority.AboveNormal;
|
||||||
@@ -146,176 +117,6 @@ namespace CUEPlayer
|
|||||||
mixThread.Name = "Mixer";
|
mixThread.Name = "Mixer";
|
||||||
mixThread.Start();
|
mixThread.Start();
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
Thread playThread;
|
|
||||||
|
|
||||||
int playingRow;
|
|
||||||
|
|
||||||
private void PlayThread()
|
|
||||||
{
|
|
||||||
AudioBuffer buff = new AudioBuffer(AudioPCMConfig.RedBook, 0x2000);
|
|
||||||
IAudioSource playingSource = null;
|
|
||||||
CUESheet playingCue = null;
|
|
||||||
long playingOffs = 0;
|
|
||||||
long playingFin = 0;
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
do
|
|
||||||
{
|
|
||||||
// End of playlist entry or source file
|
|
||||||
if (playingSource != null && (playingOffs == playingFin || playingSource.Remaining == 0))
|
|
||||||
{
|
|
||||||
this.Invoke((MethodInvoker)delegate()
|
|
||||||
{
|
|
||||||
playlist.List.Items[playingRow].BackColor = Color.White;
|
|
||||||
});
|
|
||||||
playingRow++;
|
|
||||||
playingOffs = 0;
|
|
||||||
if (playingRow >= dataSet.Playlist.Rows.Count)
|
|
||||||
break;
|
|
||||||
string path = dataSet.Playlist[playingRow].path;
|
|
||||||
int track = dataSet.Playlist[playingRow].track;
|
|
||||||
|
|
||||||
if (playingCue == null ||
|
|
||||||
playingSource == null ||
|
|
||||||
playingCue.InputPath != path ||
|
|
||||||
playingSource.Position != (long)playingCue.TOC[track].Start * 588)
|
|
||||||
{
|
|
||||||
if (playingSource != null)
|
|
||||||
{
|
|
||||||
playingSource.Close();
|
|
||||||
playingSource = null;
|
|
||||||
}
|
|
||||||
if (playingCue != null)
|
|
||||||
{
|
|
||||||
playingCue.Close();
|
|
||||||
playingCue = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
playingFin = (long)playingCue.TOC[track].Length * 588;
|
|
||||||
this.Invoke((MethodInvoker)delegate()
|
|
||||||
{
|
|
||||||
playlist.List.Items[playingRow].BackColor = Color.AliceBlue;
|
|
||||||
//deckA.UpdateDeck(dataSet, playingRow, playingCue, playingFin);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Open it
|
|
||||||
if (playingSource == null)
|
|
||||||
{
|
|
||||||
string path = dataSet.Playlist[playingRow].path;
|
|
||||||
int track = dataSet.Playlist[playingRow].track;
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
playingCue = new CUESheet(_config);
|
|
||||||
playingCue.Open(path);
|
|
||||||
playingSource = new CUESheetAudio(playingCue);
|
|
||||||
playingSource.Position = (long)playingCue.TOC[track].Start * 588 + playingOffs;
|
|
||||||
playingSource = new AudioPipe(playingSource, 0x2000);
|
|
||||||
playingFin = (long)playingCue.TOC[track].Length * 588;
|
|
||||||
this.Invoke((MethodInvoker)delegate()
|
|
||||||
{
|
|
||||||
playlist.List.Items[playingRow].BackColor = Color.AliceBlue;
|
|
||||||
//deckA.UpdateDeck(dataSet, playingRow, playingCue, playingFin);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
// skip it
|
|
||||||
playingOffs = playingFin = 0;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
playingSource.Read(buff, (int)(playingFin - playingOffs));
|
|
||||||
|
|
||||||
this.Invoke((MethodInvoker)delegate()
|
|
||||||
{
|
|
||||||
deckA.PlayingOffset = (int)playingOffs;
|
|
||||||
});
|
|
||||||
|
|
||||||
_player.Write(buff);
|
|
||||||
playingOffs += buff.Length;
|
|
||||||
} while (_player.PlaybackState != PlaybackState.Stopped);
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
// Can't invoke while joining
|
|
||||||
|
|
||||||
//if (playingRow < dataSet.Playlist.Rows.Count)
|
|
||||||
// this.Invoke((MethodInvoker)delegate()
|
|
||||||
// {
|
|
||||||
// listViewTracks.Items[playingRow].BackColor = Color.White;
|
|
||||||
// });
|
|
||||||
}
|
|
||||||
|
|
||||||
if (playingCue != null)
|
|
||||||
{
|
|
||||||
playingCue.Close();
|
|
||||||
playingCue = null;
|
|
||||||
}
|
|
||||||
if (playingSource != null)
|
|
||||||
{
|
|
||||||
playingSource.Close();
|
|
||||||
playingSource = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
internal void buttonPlay_Click(object sender, EventArgs e)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
_player.Stop();
|
|
||||||
if (playThread != null)
|
|
||||||
{
|
|
||||||
playThread.Join();
|
|
||||||
playThread = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (playlist.List.SelectedIndices.Count < 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
playingRow = playlist.List.SelectedIndices[0];
|
|
||||||
playlist.List.Items[playingRow].BackColor = Color.AliceBlue;
|
|
||||||
|
|
||||||
_player.Play();
|
|
||||||
|
|
||||||
playThread = new Thread(new ThreadStart(PlayThread));
|
|
||||||
playThread.Priority = ThreadPriority.AboveNormal;
|
|
||||||
playThread.IsBackground = true;
|
|
||||||
playThread.Start();
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
Trace.WriteLine(ex.Message);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
internal void buttonStop_Click(object sender, EventArgs e)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
_player.Stop();
|
|
||||||
if (playThread != null)
|
|
||||||
{
|
|
||||||
playThread.Join();
|
|
||||||
playThread = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
Trace.WriteLine(ex.Message);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
internal void buttonPause_Click(object sender, EventArgs e)
|
|
||||||
{
|
|
||||||
_player.Pause();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void frmCUEPlayer_FormClosing(object sender, FormClosingEventArgs e)
|
private void frmCUEPlayer_FormClosing(object sender, FormClosingEventArgs e)
|
||||||
{
|
{
|
||||||
@@ -331,23 +132,55 @@ namespace CUEPlayer
|
|||||||
|
|
||||||
private void MixThread()
|
private void MixThread()
|
||||||
{
|
{
|
||||||
AudioBuffer result = new AudioBuffer(
|
AudioBuffer result = new AudioBuffer(_mixer.PCM, _mixer.BufferSize);
|
||||||
new AudioPCMConfig(_player.PCM.BitsPerSample, _player.PCM.ChannelCount, _mixer.PCM.SampleRate), _mixer.BufferSize);
|
|
||||||
AudioBuffer resampled = _resampler == null ? null : new AudioBuffer(_player.PCM, _mixer.BufferSize * 2 * _mixer.PCM.SampleRate / _player.PCM.SampleRate);
|
|
||||||
while (true)
|
while (true)
|
||||||
{
|
{
|
||||||
//Trace.WriteLine(string.Format("Read"));
|
|
||||||
_mixer.Read(result, -1);
|
_mixer.Read(result, -1);
|
||||||
if (_resampler == null)
|
}
|
||||||
_player.Write(result);
|
}
|
||||||
else
|
|
||||||
|
public event EventHandler<UpdateMetadataEvent> updateMetadata;
|
||||||
|
|
||||||
|
public void UpdateMetadata(string artist, string title)
|
||||||
{
|
{
|
||||||
//Trace.WriteLine(string.Format("Flow: {0}", result.Length));
|
UpdateMetadataEvent e = new UpdateMetadataEvent();
|
||||||
_resampler.Flow(result, resampled);
|
e.artist = artist;
|
||||||
//Trace.WriteLine(string.Format("Play: {0}", resampled.Length));
|
e.title = title;
|
||||||
if (resampled.Length != 0)
|
if (updateMetadata != null)
|
||||||
_player.Write(resampled);
|
updateMetadata(this, e);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void icecastToolStripMenuItem_Click(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
Icecast icecast = new Icecast();
|
||||||
|
icecast.Init(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class UpdateMetadataEvent: EventArgs
|
||||||
|
{
|
||||||
|
public string artist;
|
||||||
|
public string title;
|
||||||
|
}
|
||||||
|
|
||||||
|
public class CUEPlayerSettings
|
||||||
|
{
|
||||||
|
private BindingList<CUETools.Codecs.Icecast.IcecastSettingsData> icecastServers;
|
||||||
|
|
||||||
|
public CUEPlayerSettings()
|
||||||
|
{
|
||||||
|
icecastServers = new BindingList<CUETools.Codecs.Icecast.IcecastSettingsData>();
|
||||||
|
}
|
||||||
|
|
||||||
|
public BindingList<CUETools.Codecs.Icecast.IcecastSettingsData> IcecastServers
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return icecastServers;
|
||||||
|
}
|
||||||
|
set
|
||||||
|
{
|
||||||
|
icecastServers = value;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -117,6 +117,9 @@
|
|||||||
<resheader name="writer">
|
<resheader name="writer">
|
||||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
|
<metadata name="menuStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||||
|
<value>17, 17</value>
|
||||||
|
</metadata>
|
||||||
<metadata name="$this.TrayHeight" type="System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
<metadata name="$this.TrayHeight" type="System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||||
<value>39</value>
|
<value>39</value>
|
||||||
</metadata>
|
</metadata>
|
||||||
|
|||||||
@@ -1502,9 +1502,11 @@ namespace CUETools.Codecs.FLAKE
|
|||||||
|
|
||||||
if (bs < eparams.block_size)
|
if (bs < eparams.block_size)
|
||||||
{
|
{
|
||||||
fixed (int* s = samplesBuffer)
|
for (int ch = 0; ch < (channels == 2 ? 4 : channels); ch++)
|
||||||
for (int ch = 0; ch < channels; ch++)
|
Buffer.BlockCopy(samplesBuffer, (bs + ch * Flake.MAX_BLOCKSIZE) * sizeof(int), samplesBuffer, ch * Flake.MAX_BLOCKSIZE * sizeof(int), (eparams.block_size - bs) * sizeof(int));
|
||||||
AudioSamples.MemCpy(s + ch * Flake.MAX_BLOCKSIZE, s + bs + ch * Flake.MAX_BLOCKSIZE, eparams.block_size - bs);
|
//fixed (int* s = samplesBuffer)
|
||||||
|
// for (int ch = 0; ch < channels; ch++)
|
||||||
|
// AudioSamples.MemCpy(s + ch * Flake.MAX_BLOCKSIZE, s + bs + ch * Flake.MAX_BLOCKSIZE, eparams.block_size - bs);
|
||||||
}
|
}
|
||||||
|
|
||||||
samplesInBuffer -= bs;
|
samplesInBuffer -= bs;
|
||||||
|
|||||||
61
CUETools.Codecs.Icecast/CUETools.Codecs.Icecast.csproj
Normal file
@@ -0,0 +1,61 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<PropertyGroup>
|
||||||
|
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||||
|
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||||
|
<ProductVersion>9.0.30729</ProductVersion>
|
||||||
|
<SchemaVersion>2.0</SchemaVersion>
|
||||||
|
<ProjectGuid>{8FC5DA7C-F6AC-4D04-85BC-1233DDF569E7}</ProjectGuid>
|
||||||
|
<OutputType>Library</OutputType>
|
||||||
|
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||||
|
<RootNamespace>CUETools.Codecs.Icecast</RootNamespace>
|
||||||
|
<AssemblyName>CUETools.Codecs.Icecast</AssemblyName>
|
||||||
|
<TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
|
||||||
|
<FileAlignment>512</FileAlignment>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||||
|
<DebugSymbols>true</DebugSymbols>
|
||||||
|
<DebugType>full</DebugType>
|
||||||
|
<Optimize>false</Optimize>
|
||||||
|
<OutputPath>bin\Debug\</OutputPath>
|
||||||
|
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
<WarningLevel>4</WarningLevel>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||||
|
<DebugType>pdbonly</DebugType>
|
||||||
|
<Optimize>true</Optimize>
|
||||||
|
<OutputPath>..\bin\Release\</OutputPath>
|
||||||
|
<DefineConstants>TRACE</DefineConstants>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
<WarningLevel>4</WarningLevel>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Reference Include="System" />
|
||||||
|
<Reference Include="System.Data" />
|
||||||
|
<Reference Include="System.Xml" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Compile Include="IcecastWriter.cs" />
|
||||||
|
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\CUETools.Codecs.LAME\CUETools.Codecs.LAME.csproj">
|
||||||
|
<Project>{1AF02E2C-2CB2-44B5-B417-37653071FEC6}</Project>
|
||||||
|
<Name>CUETools.Codecs.LAME</Name>
|
||||||
|
<Private>False</Private>
|
||||||
|
</ProjectReference>
|
||||||
|
<ProjectReference Include="..\CUETools.Codecs\CUETools.Codecs.csproj">
|
||||||
|
<Project>{6458A13A-30EF-45A9-9D58-E5031B17BEE2}</Project>
|
||||||
|
<Name>CUETools.Codecs</Name>
|
||||||
|
</ProjectReference>
|
||||||
|
</ItemGroup>
|
||||||
|
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||||
|
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||||
|
Other similar extension points exist, see Microsoft.Common.targets.
|
||||||
|
<Target Name="BeforeBuild">
|
||||||
|
</Target>
|
||||||
|
<Target Name="AfterBuild">
|
||||||
|
</Target>
|
||||||
|
-->
|
||||||
|
</Project>
|
||||||
264
CUETools.Codecs.Icecast/IcecastWriter.cs
Normal file
@@ -0,0 +1,264 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Text;
|
||||||
|
using System.Net;
|
||||||
|
using System.IO;
|
||||||
|
using System.Web;
|
||||||
|
using CUETools.Codecs;
|
||||||
|
|
||||||
|
namespace CUETools.Codecs.Icecast
|
||||||
|
{
|
||||||
|
public class IcecastWriter: IAudioDest
|
||||||
|
{
|
||||||
|
private long _sampleOffset = 0;
|
||||||
|
private AudioPCMConfig pcm = AudioPCMConfig.RedBook;
|
||||||
|
private LAME.LAMEEncoderCBR encoder = null;
|
||||||
|
private HttpWebRequest req = null;
|
||||||
|
private HttpWebResponse resp = null;
|
||||||
|
private Stream reqStream;
|
||||||
|
private IcecastSettingsData settings = null;
|
||||||
|
|
||||||
|
public IAudioDest Encoder
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return encoder;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public IcecastWriter(AudioPCMConfig pcm, IcecastSettingsData settings)
|
||||||
|
{
|
||||||
|
this.pcm = pcm;
|
||||||
|
this.settings = settings;
|
||||||
|
}
|
||||||
|
|
||||||
|
#region IAudioDest Members
|
||||||
|
|
||||||
|
public HttpWebResponse Response
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return resp;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Connect()
|
||||||
|
{
|
||||||
|
Uri uri = new Uri("http://" + settings.Server + ":" + settings.Port + settings.Mount);
|
||||||
|
req = (HttpWebRequest)WebRequest.Create(uri);
|
||||||
|
//req.Proxy = proxy;
|
||||||
|
//req.UserAgent = userAgent;
|
||||||
|
req.ProtocolVersion = HttpVersion.Version10; // new Version("ICE/1.0");
|
||||||
|
req.Method = "SOURCE";
|
||||||
|
req.ContentType = "audio/mpeg";
|
||||||
|
req.Headers.Add("ice-name", settings.Name ?? "no name");
|
||||||
|
req.Headers.Add("ice-public", "1");
|
||||||
|
if ((settings.Url ?? "") != "") req.Headers.Add("ice-url", settings.Url);
|
||||||
|
if ((settings.Genre ?? "") != "") req.Headers.Add("ice-genre", settings.Genre);
|
||||||
|
if ((settings.Desctiption ?? "") != "") req.Headers.Add("ice-description", settings.Desctiption);
|
||||||
|
req.Headers.Add("Authorization", string.Format("Basic {0}", Convert.ToBase64String(Encoding.ASCII.GetBytes(string.Format("source:{0}", settings.Password)))));
|
||||||
|
req.Timeout = System.Threading.Timeout.Infinite;
|
||||||
|
req.ReadWriteTimeout = System.Threading.Timeout.Infinite;
|
||||||
|
//req.ContentLength = 999999999;
|
||||||
|
req.KeepAlive = false;
|
||||||
|
req.SendChunked = true;
|
||||||
|
req.AllowWriteStreamBuffering = false;
|
||||||
|
req.CachePolicy = new System.Net.Cache.HttpRequestCachePolicy(System.Net.Cache.HttpRequestCacheLevel.BypassCache);
|
||||||
|
|
||||||
|
System.Reflection.PropertyInfo pi = typeof(ServicePoint).GetProperty("HttpBehaviour", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
|
||||||
|
pi.SetValue(req.ServicePoint, pi.PropertyType.GetField("Unknown").GetValue(null), null);
|
||||||
|
|
||||||
|
reqStream = req.GetRequestStream();
|
||||||
|
|
||||||
|
System.Reflection.FieldInfo fi = reqStream.GetType().GetField("m_HttpWriteMode", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
|
||||||
|
fi.SetValue(reqStream, fi.FieldType.GetField("Buffer").GetValue(null));
|
||||||
|
System.Reflection.MethodInfo mi = reqStream.GetType().GetMethod("CallDone", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic, null, new Type[0], null);
|
||||||
|
mi.Invoke(reqStream, null);
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
resp = req.GetResponse() as HttpWebResponse;
|
||||||
|
if (resp.StatusCode == HttpStatusCode.OK)
|
||||||
|
{
|
||||||
|
encoder = new CUETools.Codecs.LAME.LAMEEncoderCBR("", reqStream, AudioPCMConfig.RedBook);
|
||||||
|
encoder.Options = settings.MP3Options;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (WebException ex)
|
||||||
|
{
|
||||||
|
if (ex.Status == WebExceptionStatus.ProtocolError)
|
||||||
|
resp = ex.Response as HttpWebResponse;
|
||||||
|
else
|
||||||
|
throw ex;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void UpdateMetadata(string artist, string title)
|
||||||
|
{
|
||||||
|
string song = ((artist ?? "") != "" && (title ?? "") != "") ? artist + " - " + title : (title ?? "");
|
||||||
|
string metadata = "";
|
||||||
|
//if (station != "")
|
||||||
|
// metadata += "&name=" + Uri.EscapeDataString(station);
|
||||||
|
if (song != "")
|
||||||
|
metadata += "&song=" + Uri.EscapeDataString(song);
|
||||||
|
Uri uri = new Uri("http://" + settings.Server + ":" + settings.Port + "/admin/metadata?mode=updinfo&mount=" + settings.Mount + metadata);
|
||||||
|
HttpWebRequest req2 = (HttpWebRequest)WebRequest.Create(uri);
|
||||||
|
req2.Method = "GET";
|
||||||
|
req2.Credentials = new NetworkCredential("source", settings.Password);
|
||||||
|
//req.Proxy = proxy;
|
||||||
|
//req.UserAgent = userAgent;
|
||||||
|
//req2.Headers.Add("Authorization", string.Format("Basic {0}", Convert.ToBase64String(Encoding.ASCII.GetBytes(string.Format("source:{0}", settings.Password)))));
|
||||||
|
HttpStatusCode accResult = HttpStatusCode.OK;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
HttpWebResponse resp = (HttpWebResponse)req2.GetResponse();
|
||||||
|
accResult = resp.StatusCode;
|
||||||
|
if (accResult == HttpStatusCode.OK)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
resp.Close();
|
||||||
|
}
|
||||||
|
catch (WebException ex)
|
||||||
|
{
|
||||||
|
if (ex.Status == WebExceptionStatus.ProtocolError)
|
||||||
|
accResult = ((HttpWebResponse)ex.Response).StatusCode;
|
||||||
|
else
|
||||||
|
accResult = HttpStatusCode.BadRequest;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Close()
|
||||||
|
{
|
||||||
|
if (encoder != null)
|
||||||
|
{
|
||||||
|
encoder.Close();
|
||||||
|
encoder = null;
|
||||||
|
}
|
||||||
|
if (reqStream != null)
|
||||||
|
{
|
||||||
|
reqStream.Close();
|
||||||
|
reqStream = null;
|
||||||
|
}
|
||||||
|
if (resp != null)
|
||||||
|
{
|
||||||
|
resp.Close();
|
||||||
|
resp = null;
|
||||||
|
}
|
||||||
|
if (req != null)
|
||||||
|
{
|
||||||
|
req.Abort();
|
||||||
|
req = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Delete()
|
||||||
|
{
|
||||||
|
if (encoder != null)
|
||||||
|
{
|
||||||
|
encoder.Delete();
|
||||||
|
encoder = null;
|
||||||
|
}
|
||||||
|
if (reqStream != null)
|
||||||
|
{
|
||||||
|
reqStream.Close();
|
||||||
|
reqStream = null;
|
||||||
|
}
|
||||||
|
if (resp != null)
|
||||||
|
{
|
||||||
|
resp.Close();
|
||||||
|
resp = null;
|
||||||
|
}
|
||||||
|
if (req != null)
|
||||||
|
{
|
||||||
|
req.Abort();
|
||||||
|
req = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
AudioBuffer tmp;
|
||||||
|
|
||||||
|
public void Write(AudioBuffer src)
|
||||||
|
{
|
||||||
|
if (encoder == null)
|
||||||
|
throw new Exception("not connected");
|
||||||
|
|
||||||
|
if (tmp == null || tmp.Size < src.Size)
|
||||||
|
tmp = new AudioBuffer(AudioPCMConfig.RedBook, src.Size);
|
||||||
|
tmp.Prepare(-1);
|
||||||
|
Buffer.BlockCopy(src.Float, 0, tmp.Float, 0, src.Length * 8);
|
||||||
|
tmp.Length = src.Length;
|
||||||
|
encoder.Write(tmp);
|
||||||
|
}
|
||||||
|
|
||||||
|
public long Position
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return _sampleOffset;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public long BlockSize
|
||||||
|
{
|
||||||
|
set { }
|
||||||
|
}
|
||||||
|
|
||||||
|
public long FinalSampleCount
|
||||||
|
{
|
||||||
|
set { ; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public int CompressionLevel
|
||||||
|
{
|
||||||
|
get { return 0; }
|
||||||
|
set { }
|
||||||
|
}
|
||||||
|
|
||||||
|
public string Options
|
||||||
|
{
|
||||||
|
set
|
||||||
|
{
|
||||||
|
if (value == null || value == "") return;
|
||||||
|
throw new Exception("Unsupported options " + value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public AudioPCMConfig PCM
|
||||||
|
{
|
||||||
|
get { return pcm; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public string Path { get { return null; } }
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
public long BytesWritten
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return encoder == null ? 0 : encoder.BytesWritten;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class IcecastSettingsData
|
||||||
|
{
|
||||||
|
private string server;
|
||||||
|
private string port = "8000";
|
||||||
|
private string password;
|
||||||
|
private string mount;
|
||||||
|
private string name;
|
||||||
|
private string description;
|
||||||
|
private string url;
|
||||||
|
private string genre;
|
||||||
|
private string mp3Options = "-m j -b 192";
|
||||||
|
|
||||||
|
public string Server { get { return server; } set { server = value; } }
|
||||||
|
public string Port { get { return port; } set { port = value; } }
|
||||||
|
public string Password { get { return password; } set { password = value; } }
|
||||||
|
public string Mount { get { return mount; } set { mount = value; } }
|
||||||
|
public string Name { get { return name; } set { name = value; } }
|
||||||
|
public string Desctiption { get { return description; } set { description = value; } }
|
||||||
|
public string Url { get { return url; } set { url = value; } }
|
||||||
|
public string Genre { get { return genre; } set { genre = value; } }
|
||||||
|
public string MP3Options { get { return mp3Options; } set { mp3Options = value; } }
|
||||||
|
}
|
||||||
|
}
|
||||||
36
CUETools.Codecs.Icecast/Properties/AssemblyInfo.cs
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
using System.Reflection;
|
||||||
|
using System.Runtime.CompilerServices;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
|
// General Information about an assembly is controlled through the following
|
||||||
|
// set of attributes. Change these attribute values to modify the information
|
||||||
|
// associated with an assembly.
|
||||||
|
[assembly: AssemblyTitle("CUETools.Codecs.Icecast")]
|
||||||
|
[assembly: AssemblyDescription("")]
|
||||||
|
[assembly: AssemblyConfiguration("")]
|
||||||
|
[assembly: AssemblyCompany("Microsoft")]
|
||||||
|
[assembly: AssemblyProduct("CUETools.Codecs.Icecast")]
|
||||||
|
[assembly: AssemblyCopyright("Copyright © Microsoft 2010")]
|
||||||
|
[assembly: AssemblyTrademark("")]
|
||||||
|
[assembly: AssemblyCulture("")]
|
||||||
|
|
||||||
|
// Setting ComVisible to false makes the types in this assembly not visible
|
||||||
|
// to COM components. If you need to access a type in this assembly from
|
||||||
|
// COM, set the ComVisible attribute to true on that type.
|
||||||
|
[assembly: ComVisible(false)]
|
||||||
|
|
||||||
|
// The following GUID is for the ID of the typelib if this project is exposed to COM
|
||||||
|
[assembly: Guid("913f32e1-64c8-45d3-8f91-5dd1ba733fe9")]
|
||||||
|
|
||||||
|
// Version information for an assembly consists of the following four values:
|
||||||
|
//
|
||||||
|
// Major Version
|
||||||
|
// Minor Version
|
||||||
|
// Build Number
|
||||||
|
// Revision
|
||||||
|
//
|
||||||
|
// You can specify all the values or you can default the Build and Revision Numbers
|
||||||
|
// by using the '*' as shown below:
|
||||||
|
// [assembly: AssemblyVersion("1.0.*")]
|
||||||
|
[assembly: AssemblyVersion("1.0.0.0")]
|
||||||
|
[assembly: AssemblyFileVersion("1.0.0.0")]
|
||||||
@@ -20,9 +20,12 @@ namespace CUETools.Codecs.LAME
|
|||||||
private string _path;
|
private string _path;
|
||||||
private Stream _IO;
|
private Stream _IO;
|
||||||
private long position = 0, sample_count = -1;
|
private long position = 0, sample_count = -1;
|
||||||
|
private long bytesWritten = 0;
|
||||||
|
|
||||||
public LAMEEncoder(string path, Stream IO, AudioPCMConfig pcm)
|
public LAMEEncoder(string path, Stream IO, AudioPCMConfig pcm)
|
||||||
{
|
{
|
||||||
|
if (pcm.BitsPerSample != 16)// && pcm.BitsPerSample != 32)
|
||||||
|
throw new ArgumentOutOfRangeException("format", "Only 16 & 32 bits samples supported");
|
||||||
_pcm = pcm;
|
_pcm = pcm;
|
||||||
_path = path;
|
_path = path;
|
||||||
_IO = IO;
|
_IO = IO;
|
||||||
@@ -33,12 +36,14 @@ namespace CUETools.Codecs.LAME
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
public void DeInit()
|
public void DeInit(bool flush)
|
||||||
{
|
{
|
||||||
if (!inited || closed)
|
if (!inited || closed)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
try
|
try
|
||||||
|
{
|
||||||
|
if (flush)
|
||||||
{
|
{
|
||||||
uint EncodedSize = 0;
|
uint EncodedSize = 0;
|
||||||
if (m_InBufferPos > 0)
|
if (m_InBufferPos > 0)
|
||||||
@@ -48,6 +53,7 @@ namespace CUETools.Codecs.LAME
|
|||||||
if (EncodedSize > 0)
|
if (EncodedSize > 0)
|
||||||
{
|
{
|
||||||
_IO.Write(m_OutBuffer, 0, (int)EncodedSize);
|
_IO.Write(m_OutBuffer, 0, (int)EncodedSize);
|
||||||
|
bytesWritten += EncodedSize;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -57,6 +63,8 @@ namespace CUETools.Codecs.LAME
|
|||||||
if (EncodedSize > 0)
|
if (EncodedSize > 0)
|
||||||
{
|
{
|
||||||
_IO.Write(m_OutBuffer, 0, (int)EncodedSize);
|
_IO.Write(m_OutBuffer, 0, (int)EncodedSize);
|
||||||
|
bytesWritten += EncodedSize;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -64,14 +72,14 @@ namespace CUETools.Codecs.LAME
|
|||||||
{
|
{
|
||||||
Lame_encDll.beCloseStream(m_hLameStream);
|
Lame_encDll.beCloseStream(m_hLameStream);
|
||||||
_IO.Close();
|
_IO.Close();
|
||||||
}
|
|
||||||
closed = true;
|
closed = true;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void Close()
|
public void Close()
|
||||||
{
|
{
|
||||||
bool needTag = !closed && _path != null && _path != "";
|
bool needTag = !closed && _path != null && _path != "";
|
||||||
DeInit();
|
DeInit(true);
|
||||||
if (needTag)
|
if (needTag)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
@@ -88,7 +96,7 @@ namespace CUETools.Codecs.LAME
|
|||||||
{
|
{
|
||||||
if (!closed)
|
if (!closed)
|
||||||
{
|
{
|
||||||
DeInit();
|
DeInit(false);
|
||||||
if (_path != "")
|
if (_path != "")
|
||||||
File.Delete(_path);
|
File.Delete(_path);
|
||||||
}
|
}
|
||||||
@@ -150,6 +158,7 @@ namespace CUETools.Codecs.LAME
|
|||||||
if (EncodedSize > 0)
|
if (EncodedSize > 0)
|
||||||
{
|
{
|
||||||
_IO.Write(m_OutBuffer, 0, (int)EncodedSize);
|
_IO.Write(m_OutBuffer, 0, (int)EncodedSize);
|
||||||
|
bytesWritten += EncodedSize;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -167,6 +176,7 @@ namespace CUETools.Codecs.LAME
|
|||||||
if (EncodedSize > 0)
|
if (EncodedSize > 0)
|
||||||
{
|
{
|
||||||
_IO.Write(m_OutBuffer, 0, (int)EncodedSize);
|
_IO.Write(m_OutBuffer, 0, (int)EncodedSize);
|
||||||
|
bytesWritten += EncodedSize;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -234,6 +244,14 @@ namespace CUETools.Codecs.LAME
|
|||||||
}
|
}
|
||||||
|
|
||||||
public string Path { get { return _path; } }
|
public string Path { get { return _path; } }
|
||||||
|
|
||||||
|
public long BytesWritten
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return bytesWritten;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -304,8 +322,9 @@ namespace CUETools.Codecs.LAME
|
|||||||
[AudioEncoderClass("lame CBR", "mp3", false, "96 128 192 256 320", "256", 2)]
|
[AudioEncoderClass("lame CBR", "mp3", false, "96 128 192 256 320", "256", 2)]
|
||||||
public class LAMEEncoderCBR : LAMEEncoder
|
public class LAMEEncoderCBR : LAMEEncoder
|
||||||
{
|
{
|
||||||
private int bps_index;
|
private uint bps;
|
||||||
private static readonly uint[] bps_table = new uint[] {96, 128, 192, 256, 320};
|
private static readonly uint[] bps_table = new uint[] {96, 128, 192, 256, 320};
|
||||||
|
private MpegMode stereo = MpegMode.STEREO;
|
||||||
|
|
||||||
public LAMEEncoderCBR(string path, Stream IO, AudioPCMConfig pcm)
|
public LAMEEncoderCBR(string path, Stream IO, AudioPCMConfig pcm)
|
||||||
: base(path, IO, pcm)
|
: base(path, IO, pcm)
|
||||||
@@ -321,20 +340,55 @@ namespace CUETools.Codecs.LAME
|
|||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
return bps_index;
|
for (int i = 0; i < bps_table.Length; i++)
|
||||||
|
if (bps == bps_table[i])
|
||||||
|
return i;
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
set
|
set
|
||||||
{
|
{
|
||||||
if (value < 0 || value > bps_table.Length)
|
if (value < 0 || value > bps_table.Length)
|
||||||
throw new Exception("unsupported compression level");
|
throw new Exception("unsupported compression level");
|
||||||
bps_index = value;
|
bps = bps_table[value];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public override string Options
|
||||||
|
{
|
||||||
|
set
|
||||||
|
{
|
||||||
|
if (value == null || value == "") return;
|
||||||
|
string[] args = value.Split();
|
||||||
|
for (int i = 0; i < args.Length; i++)
|
||||||
|
{
|
||||||
|
if (args[i] == "-b" && (++i) < args.Length)
|
||||||
|
{
|
||||||
|
bps = uint.Parse(args[i]);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (args[i] == "-m" && (++i) < args.Length)
|
||||||
|
{
|
||||||
|
switch (args[i])
|
||||||
|
{
|
||||||
|
case "s": stereo = MpegMode.STEREO; break;
|
||||||
|
case "j": stereo = MpegMode.JOINT_STEREO; break;
|
||||||
|
case "d": stereo = MpegMode.DUAL_CHANNEL; break;
|
||||||
|
case "m": stereo = MpegMode.MONO; break;
|
||||||
|
default:
|
||||||
|
throw new Exception("Unsupported options " + value);
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
throw new Exception("Unsupported options " + value);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override BE_CONFIG MakeConfig()
|
protected override BE_CONFIG MakeConfig()
|
||||||
{
|
{
|
||||||
BE_CONFIG Mp3Config = new BE_CONFIG(PCM, bps_table[bps_index]);
|
BE_CONFIG Mp3Config = new BE_CONFIG(PCM, bps);
|
||||||
Mp3Config.format.lhv1.bWriteVBRHeader = 1;
|
Mp3Config.format.lhv1.bWriteVBRHeader = 1;
|
||||||
|
Mp3Config.format.lhv1.nMode = stereo;
|
||||||
//Mp3Config.format.lhv1.nVbrMethod = VBRMETHOD.VBR_METHOD_NONE; // --cbr
|
//Mp3Config.format.lhv1.nVbrMethod = VBRMETHOD.VBR_METHOD_NONE; // --cbr
|
||||||
//Mp3Config.format.lhv1.nPreset = LAME_QUALITY_PRESET.LQP_NORMAL_QUALITY;
|
//Mp3Config.format.lhv1.nPreset = LAME_QUALITY_PRESET.LQP_NORMAL_QUALITY;
|
||||||
return Mp3Config;
|
return Mp3Config;
|
||||||
|
|||||||
@@ -139,9 +139,6 @@ namespace CUETools.Codecs.LAME
|
|||||||
|
|
||||||
public LHV1(AudioPCMConfig format, uint MpeBitRate)
|
public LHV1(AudioPCMConfig format, uint MpeBitRate)
|
||||||
{
|
{
|
||||||
if ( format.BitsPerSample != 16)
|
|
||||||
throw new ArgumentOutOfRangeException("format", "Only 16 bits samples supported");
|
|
||||||
|
|
||||||
dwStructVersion = 1;
|
dwStructVersion = 1;
|
||||||
dwStructSize = (uint)Marshal.SizeOf(typeof(BE_CONFIG));
|
dwStructSize = (uint)Marshal.SizeOf(typeof(BE_CONFIG));
|
||||||
switch (format.SampleRate)
|
switch (format.SampleRate)
|
||||||
|
|||||||
@@ -250,6 +250,8 @@ namespace CUETools.Codecs
|
|||||||
Bytes16ToFloat(bytes, 0, fsamples, 0, length, pcm.ChannelCount);
|
Bytes16ToFloat(bytes, 0, fsamples, 0, length, pcm.ChannelCount);
|
||||||
//else if (pcm.BitsPerSample > 16 && PCM.BitsPerSample <= 24)
|
//else if (pcm.BitsPerSample > 16 && PCM.BitsPerSample <= 24)
|
||||||
// BytesToFLACSamples_24(bytes, 0, fsamples, 0, length, pcm.ChannelCount, 24 - pcm.BitsPerSample);
|
// BytesToFLACSamples_24(bytes, 0, fsamples, 0, length, pcm.ChannelCount, 24 - pcm.BitsPerSample);
|
||||||
|
else if (pcm.BitsPerSample == 32)
|
||||||
|
Buffer.BlockCopy(bytes, 0, fsamples, 0, length * 4 * pcm.ChannelCount);
|
||||||
else
|
else
|
||||||
throw new Exception("Unsupported bitsPerSample value");
|
throw new Exception("Unsupported bitsPerSample value");
|
||||||
}
|
}
|
||||||
@@ -356,6 +358,16 @@ namespace CUETools.Codecs
|
|||||||
throw new Exception("Invalid length");
|
throw new Exception("Invalid length");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
internal unsafe void Load(int dstOffset, AudioBuffer src, int srcOffset, int copyLength)
|
||||||
|
{
|
||||||
|
if (dataInBytes)
|
||||||
|
Buffer.BlockCopy(src.Bytes, srcOffset * pcm.BlockAlign, Bytes, dstOffset * pcm.BlockAlign, copyLength * pcm.BlockAlign);
|
||||||
|
if (dataInSamples)
|
||||||
|
Buffer.BlockCopy(src.Samples, srcOffset * pcm.ChannelCount * 4, Samples, dstOffset * pcm.ChannelCount * 4, copyLength * pcm.ChannelCount * 4);
|
||||||
|
if (dataInFloat)
|
||||||
|
Buffer.BlockCopy(src.Float, srcOffset * pcm.ChannelCount * 4, Float, dstOffset * pcm.ChannelCount * 4, copyLength * pcm.ChannelCount * 4);
|
||||||
|
}
|
||||||
|
|
||||||
public unsafe void Prepare(AudioBuffer _src, int _offset, int _length)
|
public unsafe void Prepare(AudioBuffer _src, int _offset, int _length)
|
||||||
{
|
{
|
||||||
length = Math.Min(size, _src.Length - _offset);
|
length = Math.Min(size, _src.Length - _offset);
|
||||||
@@ -365,19 +377,12 @@ namespace CUETools.Codecs
|
|||||||
dataInFloat = false;
|
dataInFloat = false;
|
||||||
dataInSamples = false;
|
dataInSamples = false;
|
||||||
if (_src.dataInBytes)
|
if (_src.dataInBytes)
|
||||||
{
|
|
||||||
dataInBytes = true;
|
dataInBytes = true;
|
||||||
fixed (byte* dest = Bytes, src = &_src.Bytes[_offset * pcm.BlockAlign])
|
|
||||||
AudioSamples.MemCpy(dest, src, length * pcm.BlockAlign);
|
|
||||||
}
|
|
||||||
else if (_src.dataInSamples)
|
else if (_src.dataInSamples)
|
||||||
{
|
|
||||||
dataInSamples = true;
|
dataInSamples = true;
|
||||||
fixed (int* dest = Samples, src = &_src.Samples[_offset, 0])
|
|
||||||
AudioSamples.MemCpy(dest, src, Length * pcm.ChannelCount);
|
|
||||||
}
|
|
||||||
else if (_src.dataInFloat)
|
else if (_src.dataInFloat)
|
||||||
throw new NotImplementedException();
|
dataInFloat = true;
|
||||||
|
Load(0, _src, _offset, length);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Swap(AudioBuffer buffer)
|
public void Swap(AudioBuffer buffer)
|
||||||
@@ -1731,6 +1736,10 @@ namespace CUETools.Codecs
|
|||||||
Process _encoderProcess;
|
Process _encoderProcess;
|
||||||
WAVWriter wrt;
|
WAVWriter wrt;
|
||||||
CyclicBuffer outputBuffer = null;
|
CyclicBuffer outputBuffer = null;
|
||||||
|
bool useTempFile = false;
|
||||||
|
string tempFile = null;
|
||||||
|
long _finalSampleCount = -1;
|
||||||
|
bool closed = false;
|
||||||
|
|
||||||
public UserDefinedWriter(string path, Stream IO, AudioPCMConfig pcm, string encoder, string encoderParams, string encoderMode, int padding)
|
public UserDefinedWriter(string path, Stream IO, AudioPCMConfig pcm, string encoder, string encoderParams, string encoderMode, int padding)
|
||||||
{
|
{
|
||||||
@@ -1738,15 +1747,23 @@ namespace CUETools.Codecs
|
|||||||
_encoder = encoder;
|
_encoder = encoder;
|
||||||
_encoderParams = encoderParams;
|
_encoderParams = encoderParams;
|
||||||
_encoderMode = encoderMode;
|
_encoderMode = encoderMode;
|
||||||
|
useTempFile = _encoderParams.Contains("%I");
|
||||||
|
tempFile = path + ".tmp.wav";
|
||||||
|
|
||||||
_encoderProcess = new Process();
|
_encoderProcess = new Process();
|
||||||
_encoderProcess.StartInfo.FileName = _encoder;
|
_encoderProcess.StartInfo.FileName = _encoder;
|
||||||
_encoderProcess.StartInfo.Arguments = _encoderParams.Replace("%O", "\"" + path + "\"").Replace("%M", encoderMode).Replace("%P", padding.ToString());
|
_encoderProcess.StartInfo.Arguments = _encoderParams.Replace("%O", "\"" + path + "\"").Replace("%M", encoderMode).Replace("%P", padding.ToString()).Replace("%I", "\"" + tempFile + "\"");
|
||||||
_encoderProcess.StartInfo.CreateNoWindow = true;
|
_encoderProcess.StartInfo.CreateNoWindow = true;
|
||||||
|
if (!useTempFile)
|
||||||
_encoderProcess.StartInfo.RedirectStandardInput = true;
|
_encoderProcess.StartInfo.RedirectStandardInput = true;
|
||||||
_encoderProcess.StartInfo.UseShellExecute = false;
|
_encoderProcess.StartInfo.UseShellExecute = false;
|
||||||
if (!_encoderParams.Contains("%O"))
|
if (!_encoderParams.Contains("%O"))
|
||||||
_encoderProcess.StartInfo.RedirectStandardOutput = true;
|
_encoderProcess.StartInfo.RedirectStandardOutput = true;
|
||||||
|
if (useTempFile)
|
||||||
|
{
|
||||||
|
wrt = new WAVWriter(tempFile, null, pcm);
|
||||||
|
return;
|
||||||
|
}
|
||||||
bool started = false;
|
bool started = false;
|
||||||
Exception ex = null;
|
Exception ex = null;
|
||||||
try
|
try
|
||||||
@@ -1772,9 +1789,32 @@ namespace CUETools.Codecs
|
|||||||
|
|
||||||
public void Close()
|
public void Close()
|
||||||
{
|
{
|
||||||
|
if (closed)
|
||||||
|
return;
|
||||||
|
closed = true;
|
||||||
wrt.Close();
|
wrt.Close();
|
||||||
|
if (useTempFile && (_finalSampleCount < 0 || wrt.Position == _finalSampleCount))
|
||||||
|
{
|
||||||
|
bool started = false;
|
||||||
|
Exception ex = null;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
started = _encoderProcess.Start();
|
||||||
|
if (started)
|
||||||
|
_encoderProcess.PriorityClass = Process.GetCurrentProcess().PriorityClass;
|
||||||
|
}
|
||||||
|
catch (Exception _ex)
|
||||||
|
{
|
||||||
|
ex = _ex;
|
||||||
|
}
|
||||||
|
if (!started)
|
||||||
|
throw new Exception(_encoder + ": " + (ex == null ? "please check the path" : ex.Message));
|
||||||
|
}
|
||||||
|
wrt = null;
|
||||||
if (!_encoderProcess.HasExited)
|
if (!_encoderProcess.HasExited)
|
||||||
_encoderProcess.WaitForExit();
|
_encoderProcess.WaitForExit();
|
||||||
|
if (useTempFile)
|
||||||
|
File.Delete(tempFile);
|
||||||
if (outputBuffer != null)
|
if (outputBuffer != null)
|
||||||
outputBuffer.Close();
|
outputBuffer.Close();
|
||||||
if (_encoderProcess.ExitCode != 0)
|
if (_encoderProcess.ExitCode != 0)
|
||||||
@@ -1797,7 +1837,7 @@ namespace CUETools.Codecs
|
|||||||
|
|
||||||
public long FinalSampleCount
|
public long FinalSampleCount
|
||||||
{
|
{
|
||||||
set { wrt.FinalSampleCount = value; }
|
set { _finalSampleCount = wrt.FinalSampleCount = value; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public long BlockSize
|
public long BlockSize
|
||||||
@@ -1948,6 +1988,7 @@ namespace CUETools.Codecs
|
|||||||
public class AudioPipe : IAudioSource//, IDisposable
|
public class AudioPipe : IAudioSource//, IDisposable
|
||||||
{
|
{
|
||||||
private AudioBuffer _readBuffer, _writeBuffer;
|
private AudioBuffer _readBuffer, _writeBuffer;
|
||||||
|
private AudioPCMConfig pcm;
|
||||||
long _sampleLen, _samplePos;
|
long _sampleLen, _samplePos;
|
||||||
private int _maxLength;
|
private int _maxLength;
|
||||||
private Thread _workThread;
|
private Thread _workThread;
|
||||||
@@ -1959,14 +2000,22 @@ namespace CUETools.Codecs
|
|||||||
bool own;
|
bool own;
|
||||||
ThreadPriority priority;
|
ThreadPriority priority;
|
||||||
|
|
||||||
|
public AudioPipe(AudioPCMConfig pcm, int size)
|
||||||
|
{
|
||||||
|
this.pcm = pcm;
|
||||||
|
_readBuffer = new AudioBuffer(pcm, size);
|
||||||
|
_writeBuffer = new AudioBuffer(pcm, size);
|
||||||
|
_maxLength = size;
|
||||||
|
_sampleLen = -1;
|
||||||
|
_samplePos = 0;
|
||||||
|
}
|
||||||
|
|
||||||
public AudioPipe(IAudioSource source, int size, bool own, ThreadPriority priority)
|
public AudioPipe(IAudioSource source, int size, bool own, ThreadPriority priority)
|
||||||
|
: this(source.PCM, size)
|
||||||
{
|
{
|
||||||
this.own = own;
|
this.own = own;
|
||||||
this.priority = priority;
|
this.priority = priority;
|
||||||
_source = source;
|
_source = source;
|
||||||
_readBuffer = new AudioBuffer(source, size);
|
|
||||||
_writeBuffer = new AudioBuffer(source, size);
|
|
||||||
_maxLength = size;
|
|
||||||
_sampleLen = _source.Length;
|
_sampleLen = _source.Length;
|
||||||
_samplePos = _source.Position;
|
_samplePos = _source.Position;
|
||||||
}
|
}
|
||||||
@@ -2014,7 +2063,7 @@ namespace CUETools.Codecs
|
|||||||
|
|
||||||
private void Go()
|
private void Go()
|
||||||
{
|
{
|
||||||
if (_workThread != null || _ex != null) return;
|
if (_workThread != null || _ex != null || _source == null) return;
|
||||||
_workThread = new Thread(Decompress);
|
_workThread = new Thread(Decompress);
|
||||||
_workThread.Priority = priority;
|
_workThread.Priority = priority;
|
||||||
_workThread.IsBackground = true;
|
_workThread.IsBackground = true;
|
||||||
@@ -2067,6 +2116,9 @@ namespace CUETools.Codecs
|
|||||||
if (value == _samplePos)
|
if (value == _samplePos)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if (_source == null)
|
||||||
|
throw new NotSupportedException();
|
||||||
|
|
||||||
lock (this)
|
lock (this)
|
||||||
{
|
{
|
||||||
_close = true;
|
_close = true;
|
||||||
@@ -2107,10 +2159,40 @@ namespace CUETools.Codecs
|
|||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
return _source.PCM;
|
return pcm;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int Write(AudioBuffer buff)
|
||||||
|
{
|
||||||
|
if (_writeBuffer.Size < _writeBuffer.Length + buff.Length)
|
||||||
|
{
|
||||||
|
AudioBuffer realloced = new AudioBuffer(pcm, _writeBuffer.Size + buff.Size);
|
||||||
|
realloced.Prepare(_writeBuffer, 0, _writeBuffer.Length);
|
||||||
|
_writeBuffer = realloced;
|
||||||
|
}
|
||||||
|
if (_writeBuffer.Length == 0)
|
||||||
|
_writeBuffer.Prepare(buff, 0, buff.Length);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_writeBuffer.Load(_writeBuffer.Length, buff, 0, buff.Length);
|
||||||
|
_writeBuffer.Length += buff.Length;
|
||||||
|
}
|
||||||
|
lock (this)
|
||||||
|
{
|
||||||
|
if (!_haveData)
|
||||||
|
{
|
||||||
|
AudioBuffer temp = _writeBuffer;
|
||||||
|
_writeBuffer = _readBuffer;
|
||||||
|
_writeBuffer.Length = 0;
|
||||||
|
_readBuffer = temp;
|
||||||
|
_haveData = true;
|
||||||
|
Monitor.Pulse(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return _writeBuffer.Length;
|
||||||
|
}
|
||||||
|
|
||||||
public int Read(AudioBuffer buff, int maxLength)
|
public int Read(AudioBuffer buff, int maxLength)
|
||||||
{
|
{
|
||||||
Go();
|
Go();
|
||||||
@@ -2152,7 +2234,15 @@ namespace CUETools.Codecs
|
|||||||
return buff.Length;
|
return buff.Length;
|
||||||
}
|
}
|
||||||
|
|
||||||
public string Path { get { return _source.Path; } }
|
public string Path
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
if (_source == null)
|
||||||
|
return "";
|
||||||
|
return _source.Path;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public class NullStream : Stream
|
public class NullStream : Stream
|
||||||
|
|||||||
@@ -15,9 +15,14 @@ namespace CUETools.DSP.Mixer
|
|||||||
float[] volume;
|
float[] volume;
|
||||||
long samplePos;
|
long samplePos;
|
||||||
int size;
|
int size;
|
||||||
|
AudioReadEventArgs audioReadArgs = new AudioReadEventArgs();
|
||||||
|
|
||||||
|
public event EventHandler<AudioReadEventArgs> AudioRead;
|
||||||
|
|
||||||
public MixingSource(AudioPCMConfig pcm, int delay, int sources)
|
public MixingSource(AudioPCMConfig pcm, int delay, int sources)
|
||||||
{
|
{
|
||||||
|
if (pcm.BitsPerSample != 32)
|
||||||
|
throw new NotSupportedException("please use 32 bits per sample (float)");
|
||||||
this.pcm = pcm;
|
this.pcm = pcm;
|
||||||
this.size = delay * pcm.SampleRate / 1000;
|
this.size = delay * pcm.SampleRate / 1000;
|
||||||
this.buf = new MixingBuffer[2];
|
this.buf = new MixingBuffer[2];
|
||||||
@@ -105,6 +110,14 @@ namespace CUETools.DSP.Mixer
|
|||||||
mixoffs = 0;
|
mixoffs = 0;
|
||||||
}
|
}
|
||||||
samplePos += result.Length;
|
samplePos += result.Length;
|
||||||
|
|
||||||
|
if (AudioRead != null)
|
||||||
|
{
|
||||||
|
audioReadArgs.source = this;
|
||||||
|
audioReadArgs.buffer = result;
|
||||||
|
AudioRead(this, audioReadArgs);
|
||||||
|
}
|
||||||
|
|
||||||
return result.Length;
|
return result.Length;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -331,7 +344,7 @@ namespace CUETools.DSP.Mixer
|
|||||||
}
|
}
|
||||||
|
|
||||||
int chunk = Math.Min(buff.Length - buff_offs, mixbuff.source[iSource].Size - mixbuff.source[iSource].Length);
|
int chunk = Math.Min(buff.Length - buff_offs, mixbuff.source[iSource].Size - mixbuff.source[iSource].Length);
|
||||||
Buffer.BlockCopy(buff.Bytes, buff_offs * bs, mixbuff.source[iSource].Bytes, mixbuff.source[iSource].Length * bs, chunk * bs);
|
Buffer.BlockCopy(buff.Float, buff_offs * bs, mixbuff.source[iSource].Float, mixbuff.source[iSource].Length * bs, chunk * bs);
|
||||||
mixbuff.source[iSource].Length += chunk;
|
mixbuff.source[iSource].Length += chunk;
|
||||||
buff_offs += chunk;
|
buff_offs += chunk;
|
||||||
|
|
||||||
@@ -347,4 +360,10 @@ namespace CUETools.DSP.Mixer
|
|||||||
|
|
||||||
public string Path { get { return ""; } }
|
public string Path { get { return ""; } }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public class AudioReadEventArgs: EventArgs
|
||||||
|
{
|
||||||
|
public IAudioSource source;
|
||||||
|
public AudioBuffer buffer;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -45,7 +45,7 @@ namespace CUETools.FlakeExe
|
|||||||
Console.WriteLine(" -f #[,#] Prediction order {max} or {min},{max} (0..4).");
|
Console.WriteLine(" -f #[,#] Prediction order {max} or {min},{max} (0..4).");
|
||||||
}
|
}
|
||||||
|
|
||||||
static void Main(string[] args)
|
static int Main(string[] args)
|
||||||
{
|
{
|
||||||
TextWriter stdout = Console.Out;
|
TextWriter stdout = Console.Out;
|
||||||
Console.SetOut(Console.Error);
|
Console.SetOut(Console.Error);
|
||||||
@@ -143,13 +143,13 @@ namespace CUETools.FlakeExe
|
|||||||
if (!ok)
|
if (!ok)
|
||||||
{
|
{
|
||||||
Usage();
|
Usage();
|
||||||
return;
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (input_file == null || ((input_file == "-" || Path.GetExtension(input_file) == ".flac") && output_file == null))
|
if (input_file == null || ((input_file == "-" || Path.GetExtension(input_file) == ".flac") && output_file == null))
|
||||||
{
|
{
|
||||||
Usage();
|
Usage();
|
||||||
return;
|
return 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!quiet)
|
if (!quiet)
|
||||||
@@ -170,7 +170,7 @@ namespace CUETools.FlakeExe
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
Usage();
|
Usage();
|
||||||
return;
|
return 3;
|
||||||
}
|
}
|
||||||
if (buffered)
|
if (buffered)
|
||||||
audioSource = new AudioPipe(audioSource, 0x10000);
|
audioSource = new AudioPipe(audioSource, 0x10000);
|
||||||
@@ -231,7 +231,7 @@ namespace CUETools.FlakeExe
|
|||||||
Usage();
|
Usage();
|
||||||
Console.WriteLine("");
|
Console.WriteLine("");
|
||||||
Console.WriteLine("Error: {0}.", ex.Message);
|
Console.WriteLine("Error: {0}.", ex.Message);
|
||||||
return;
|
return 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!quiet)
|
if (!quiet)
|
||||||
@@ -240,6 +240,10 @@ namespace CUETools.FlakeExe
|
|||||||
Console.WriteLine("File Info : {0}kHz; {1} channel; {2} bit; {3}", audioSource.PCM.SampleRate, audioSource.PCM.ChannelCount, audioSource.PCM.BitsPerSample, TimeSpan.FromSeconds(audioSource.Length * 1.0 / audioSource.PCM.SampleRate));
|
Console.WriteLine("File Info : {0}kHz; {1} channel; {2} bit; {3}", audioSource.PCM.SampleRate, audioSource.PCM.ChannelCount, audioSource.PCM.BitsPerSample, TimeSpan.FromSeconds(audioSource.Length * 1.0 / audioSource.PCM.SampleRate));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if !DEBUG
|
||||||
|
try
|
||||||
|
#endif
|
||||||
|
{
|
||||||
while (audioSource.Read(buff, -1) != 0)
|
while (audioSource.Read(buff, -1) != 0)
|
||||||
{
|
{
|
||||||
audioDest.Write(buff);
|
audioDest.Write(buff);
|
||||||
@@ -259,6 +263,17 @@ namespace CUETools.FlakeExe
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
audioDest.Close();
|
audioDest.Close();
|
||||||
|
}
|
||||||
|
#if !DEBUG
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Console.Error.Write("\r \r");
|
||||||
|
Console.WriteLine("Error : {0}", ex.Message);
|
||||||
|
audioDest.Delete();
|
||||||
|
audioSource.Close();
|
||||||
|
return 5;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
TimeSpan totalElapsed = DateTime.Now - start;
|
TimeSpan totalElapsed = DateTime.Now - start;
|
||||||
if (!quiet)
|
if (!quiet)
|
||||||
@@ -293,6 +308,7 @@ namespace CUETools.FlakeExe
|
|||||||
flake.VBRMode
|
flake.VBRMode
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -167,6 +167,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CUETools.DSP.Mixer", "..\CU
|
|||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CUETools.DSP.Resampler", "..\CUETools.DSP.Resampler\CUETools.DSP.Resampler.csproj", "{A6303861-CA06-4C2C-A104-BA9291538F6F}"
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CUETools.DSP.Resampler", "..\CUETools.DSP.Resampler\CUETools.DSP.Resampler.csproj", "{A6303861-CA06-4C2C-A104-BA9291538F6F}"
|
||||||
EndProject
|
EndProject
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CUETools.Codecs.Icecast", "..\CUETools.Codecs.Icecast\CUETools.Codecs.Icecast.csproj", "{8FC5DA7C-F6AC-4D04-85BC-1233DDF569E7}"
|
||||||
|
EndProject
|
||||||
Global
|
Global
|
||||||
GlobalSection(TestCaseManagementSettings) = postSolution
|
GlobalSection(TestCaseManagementSettings) = postSolution
|
||||||
CategoryFile = CUETools1.vsmdi
|
CategoryFile = CUETools1.vsmdi
|
||||||
@@ -630,6 +632,14 @@ Global
|
|||||||
{A6303861-CA06-4C2C-A104-BA9291538F6F}.Release|Any CPU.Build.0 = Release|Any CPU
|
{A6303861-CA06-4C2C-A104-BA9291538F6F}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
{A6303861-CA06-4C2C-A104-BA9291538F6F}.Release|Win32.ActiveCfg = Release|Any CPU
|
{A6303861-CA06-4C2C-A104-BA9291538F6F}.Release|Win32.ActiveCfg = Release|Any CPU
|
||||||
{A6303861-CA06-4C2C-A104-BA9291538F6F}.Release|x64.ActiveCfg = Release|Any CPU
|
{A6303861-CA06-4C2C-A104-BA9291538F6F}.Release|x64.ActiveCfg = Release|Any CPU
|
||||||
|
{8FC5DA7C-F6AC-4D04-85BC-1233DDF569E7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{8FC5DA7C-F6AC-4D04-85BC-1233DDF569E7}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{8FC5DA7C-F6AC-4D04-85BC-1233DDF569E7}.Debug|Win32.ActiveCfg = Debug|Any CPU
|
||||||
|
{8FC5DA7C-F6AC-4D04-85BC-1233DDF569E7}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||||
|
{8FC5DA7C-F6AC-4D04-85BC-1233DDF569E7}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{8FC5DA7C-F6AC-4D04-85BC-1233DDF569E7}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{8FC5DA7C-F6AC-4D04-85BC-1233DDF569E7}.Release|Win32.ActiveCfg = Release|Any CPU
|
||||||
|
{8FC5DA7C-F6AC-4D04-85BC-1233DDF569E7}.Release|x64.ActiveCfg = Release|Any CPU
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
HideSolutionNode = FALSE
|
HideSolutionNode = FALSE
|
||||||
|
|||||||