2508271258

撥放器更新至 4.0測試版
軟體版本2.10
This commit is contained in:
jasonchenwork 2025-08-27 12:59:37 +08:00
parent 2466c8cb6a
commit 2b25b14047
7 changed files with 296 additions and 100 deletions

6
NuGet.Config Normal file
View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<packageSources>
<add key="videolan-preview" value="https://f.feedz.io/videolan/preview/nuget/index.json" />
</packageSources>
</configuration>

View File

@ -55,7 +55,7 @@ namespace DualScreenDemo
private Button musicDownButton; private Button musicDownButton;
private Button micUpButton; private Button micUpButton;
private Button micDownButton; private Button micDownButton;
private Button originalSongButton; public Button originalSongButton;
private Button replayButton; private Button replayButton;
public Button pauseButton; public Button pauseButton;
public Button playButton; public Button playButton;
@ -210,7 +210,7 @@ namespace DualScreenDemo
private Timer autoRefreshTimer; private Timer autoRefreshTimer;
private Timer timerCountdown; private Timer timerCountdown;
string Rtime; string Rtime;
bool test = true; bool test = false;
//private Label pageNumberLabel; // 添加頁碼標籤 //private Label pageNumberLabel; // 添加頁碼標籤
public PrimaryForm() public PrimaryForm()
{ {

View File

@ -14,7 +14,7 @@ namespace DualScreenDemo
private static PrimaryForm primaryForm; // 儲存實例的參考 private static PrimaryForm primaryForm; // 儲存實例的參考
public static Room room = new Room(); public static Room room = new Room();
public static string verSion = "Server V2.9 202508221643"; public static string verSion = "Server V2.10 202508270919";
[STAThread] [STAThread]
static void Main() static void Main()

View File

@ -1,29 +1,9 @@
using System.IO; using System.IO;
using LibVLCSharp.Shared; using DirectShowLib;
using LibVLCSharp;
namespace DualScreenDemo.Services namespace DualScreenDemo.Services
{ {
public static class ControlExtensions
{
public static Task InvokeAsync(this Control control, Func<Task> func)
{
var tcs = new TaskCompletionSource<object>();
control.BeginInvoke(new Action(async () =>
{
try
{
await func();
tcs.SetResult(null);
}
catch (Exception ex)
{
tcs.SetException(ex);
}
}));
return tcs.Task;
}
}
public class MediaService : IDisposable public class MediaService : IDisposable
{ {
private LibVLC _libVLC; private LibVLC _libVLC;
@ -36,7 +16,7 @@ namespace DualScreenDemo.Services
Core.Initialize(); Core.Initialize();
_libVLC = new LibVLC( _libVLC = new LibVLC(
// "--verbose=-1", // "--verbose=-1",
enableDebugLogs: true, // enableDebugLogs: true,
"--audio-time-stretch", "--audio-time-stretch",
"--vout=automatic", "--vout=automatic",
"--h264-fps=30", "--h264-fps=30",
@ -46,10 +26,10 @@ namespace DualScreenDemo.Services
"--audio-time-stretch" "--audio-time-stretch"
); );
_libVLC.Log += (sender, args) => // _libVLC.Log += (sender, args) =>
{ // {
Console.WriteLine($"[{args.Level}] {args.Message}"); // Console.WriteLine($"[{args.Level}] {args.Message}");
}; // };
_mediaPlayer = new MediaPlayer(_libVLC); _mediaPlayer = new MediaPlayer(_libVLC);
_mediaPlayer.AspectRatio = "16:9"; _mediaPlayer.AspectRatio = "16:9";
@ -80,7 +60,7 @@ namespace DualScreenDemo.Services
public bool IsAtEnd() public bool IsAtEnd()
{ {
if (_mediaPlayer.State == VLCState.Ended) if (_mediaPlayer.State == VLCState.Stopped)
{ {
return true; return true;
} }
@ -97,40 +77,17 @@ namespace DualScreenDemo.Services
private bool _isTransitioning = false; private bool _isTransitioning = false;
public void LoadMedia(string filePath, int audioTrackIndex = 0) public void LoadMedia(string filePath, int audioTrackIndex = 0)
{ {
try try
{ {
// _mediaPlayer.Stop(); _mediaPlayer.Stop();
_media?.Dispose(); _media?.Dispose();
_media = new Media(_libVLC, filePath, FromType.FromPath); _media = new Media(filePath, FromType.FromPath);
_mediaPlayer.Play(addMediaOption(_media, audioTrackIndex)); _mediaPlayer.Play(addMediaOption(_media, audioTrackIndex));
_mediaPlayer.Stopped += (s, e) => Console.WriteLine("Player Stopped"); _mediaPlayer.Fullscreen=true;
_mediaPlayer.Mute = false;
// _mediaPlayer.EndReached += async(s, e) => // _mediaPlayer.Stopped += (s, e) => Console.WriteLine("Player Stopped");
// {
// if (_isTransitioning) return;
// _isTransitioning = true;
// try
// {
// await VideoPlayerForm.Instance.InvokeAsync(async () =>
// {
// await VideoPlayerForm.Instance.PlayNextSong();
// await Task.Delay(2000); // Optional delay
// });
// }
// catch (Exception ex)
// {
// Console.WriteLine($"Error during transition: {ex.Message}");
// }
// finally
// {
// _isTransitioning = false;
// }
// };
} }
catch (Exception ex) catch (Exception ex)
{ {
@ -142,11 +99,13 @@ namespace DualScreenDemo.Services
private Media addMediaOption(Media media, int audioTrackIndex) private Media addMediaOption(Media media, int audioTrackIndex)
{ {
media.AddOption(":avcodec-hw=dxva2"); media.AddOption(":avcodec-hw=dxva2");
media.AddOption($":drop-late-frames"); media.AddOption(":drop-late-frames");
media.AddOption(":audio-output=directsound"); media.AddOption(":audio-output=directsound");
media.AddOption(":network-caching=300"); media.AddOption(":network-caching=300");
media.AddOption(":live-caching=300"); media.AddOption(":live-caching=300");
media.AddOption(":file-caching=300"); media.AddOption(":file-caching=300");
media.AddOption(":clock-jitter=0");
media.AddOption(":clock-synchro=0");
media.AddOption($":audio-track={audioTrackIndex}"); media.AddOption($":audio-track={audioTrackIndex}");
return media; return media;
} }
@ -164,20 +123,20 @@ namespace DualScreenDemo.Services
if (media == null) return result; if (media == null) return result;
if (!media.IsParsed) //if (!media.IsParsed)
media.Parse(MediaParseOptions.ParseLocal); // media.Parse(MediaParseOptions.ParseLocal);
var tracks = media.Tracks; //var tracks = media.Tracks;
if (tracks == null) return result; // if (tracks == null) return result;
foreach (var track in tracks.Where(t => t.TrackType == TrackType.Audio)) // foreach (var track in tracks.Where(t => t.TrackType == TrackType.Audio))
{ // {
result.Add(new TrackDescription // result.Add(new TrackDescription
{ // {
Id = track.Id, // Id = track.Id,
Name = !string.IsNullOrEmpty(track.Language) ? track.Language : $"Audio Track {track.Id}" // Name = !string.IsNullOrEmpty(track.Language) ? track.Language : $"Audio Track {track.Id}"
}); // });
} // }
return result; return result;
} }
@ -185,12 +144,12 @@ namespace DualScreenDemo.Services
{ {
var audioTracks = GetAudioTracks(); var audioTracks = GetAudioTracks();
if (trackIndex < 0 || trackIndex >= audioTracks.Count) return; if (trackIndex < 0 || trackIndex >= audioTracks.Count) return;
_mediaPlayer.SetAudioTrack(audioTracks[trackIndex].Id); //_mediaPlayer.SetAudioTrack(audioTracks[trackIndex].Id);
} }
#endregion #endregion
#region Volume #region Volume
public void SetVolume(int volume) => _mediaPlayer.Volume = volume; public void SetVolume(int volume) => _mediaPlayer.SetVolume(volume);
public int GetVolume() => _mediaPlayer.Volume; public int GetVolume() => _mediaPlayer.Volume;
public bool Mute(bool isMuted) public bool Mute(bool isMuted)
{ {

View File

@ -2,7 +2,8 @@ using System.Runtime.InteropServices;
using DBObj; using DBObj;
using OverlayFormObj; using OverlayFormObj;
using DualScreenDemo.Services; using DualScreenDemo.Services;
using LibVLCSharp.WinForms; using LibVLCSharp;
namespace DualScreenDemo namespace DualScreenDemo
{ {
public class VideoPlayerForm : Form public class VideoPlayerForm : Form
@ -348,12 +349,23 @@ namespace DualScreenDemo
{ {
string pathToPlay = song.getFile(); string pathToPlay = song.getFile();
_mediaService0.LoadMedia(pathToPlay, 0); _mediaService0.LoadMedia(pathToPlay, 0);
_mediaService0.Player.Media.AddOption(":no-audio");
_mediaService0.Player.AspectRatio = "8:5";
// _mediaService0.Player.Scale = 1.5f;
_mediaService1.LoadMedia(pathToPlay, song.isPublicSong ? 0 : 1); _mediaService1.LoadMedia(pathToPlay, song.isPublicSong ? 0 : 1);
// Play();
// Thread.Sleep(100);
// isVocalRemoved = true; if (song.isPublicSong)
Mute(isMuted); {
PrimaryForm.Instance.originalSongButton.Click -= PrimaryForm.Instance.OriginalSongButton_Click;
}
else
{
PrimaryForm.Instance.originalSongButton.Click -= PrimaryForm.Instance.OriginalSongButton_Click;
PrimaryForm.Instance.originalSongButton.Click += PrimaryForm.Instance.OriginalSongButton_Click;
}
isVocalRemoved = true;
if (isMuted) { Mute(true); }
// 音量處理 // 音量處理
SetVolume(100 + song.getBasic().getDbChange()); SetVolume(100 + song.getBasic().getDbChange());
Task.Run(() => Thread.Sleep(100)); Task.Run(() => Thread.Sleep(100));
@ -365,13 +377,6 @@ namespace DualScreenDemo
{ {
Console.WriteLine(ex.Message); Console.WriteLine(ex.Message);
Program.WriteLog(ex.ToString()); Program.WriteLog(ex.ToString());
Stop();
_mediaService0.Dispose();
_mediaService1.Dispose();
_mediaService0 = new MediaService();
_mediaService1 = new MediaService();
this.Invoke(VideoPlayerForm_Shown);
InitializeAndPlayMedia(song);
return Task.CompletedTask; return Task.CompletedTask;
} }
@ -493,12 +498,13 @@ namespace DualScreenDemo
{ {
if (isMuted) if (isMuted)
{ {
_mediaService0.Mute(true); // _mediaService0.Mute(true);
_mediaService1.Mute(true); _mediaService1.Mute(true);
} }
else else
{ {
_ToggleVocalRemoval(isVocalRemoved); // _ToggleVocalRemoval(isVocalRemoved);
_mediaService1.Mute(false);
} }
return isMuted; return isMuted;
} }
@ -512,19 +518,27 @@ namespace DualScreenDemo
{ {
return _mediaService1.GetVolume(); return _mediaService1.GetVolume();
} }
private bool isVocalRemoved = true; private bool isVocalRemoved = true;
public void ToggleVocalRemoval() public void ToggleVocalRemoval()
{ {
isVocalRemoved = _ToggleVocalRemoval(!isVocalRemoved); if (isVocalRemoved)
{
_mediaService1.Player.Select(TrackType.Audio, "audio/2");
isVocalRemoved = false;
}
else
{
_mediaService1.Player.Select(TrackType.Audio, "audio/1,audio/3");
// _mediaService1.Player.Select(TrackType.Audio, "audio/3");
isVocalRemoved = true;
}
// isVocalRemoved = _ToggleVocalRemoval(!isVocalRemoved);
OverlayForm.MainForm.ShowTopRightLabelTime(isVocalRemoved ? "無人聲" : "有人聲"); OverlayForm.MainForm.ShowTopRightLabelTime(isVocalRemoved ? "無人聲" : "有人聲");
} }
private bool _ToggleVocalRemoval(bool isVocal)
{
_mediaService0.Mute(isVocal);
_mediaService1.Mute(!isVocal);
return isVocal;
}
} }
} }

View File

@ -13,15 +13,16 @@
<ApplicationManifest>app.manifest</ApplicationManifest> <!-- 確保這一行引用了 manifest 文件 --> <ApplicationManifest>app.manifest</ApplicationManifest> <!-- 確保這一行引用了 manifest 文件 -->
<UseWindowsForms>true</UseWindowsForms> <UseWindowsForms>true</UseWindowsForms>
<NoWarn>CS8618,CS8602,CS8622,CS8625,CS8600,CS8603,CS8601,CS8604,CS4014</NoWarn> <NoWarn>CS8618,CS8602,CS8622,CS8625,CS8600,CS8603,CS8601,CS8604,CS4014</NoWarn>
<PlatformTarget>AnyCPU</PlatformTarget>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="LibVLCSharp" Version="3.9.4" /> <PackageReference Include="LibVLCSharp" Version="4.0.0-alpha-20250825-9139" />
<PackageReference Include="LibVLCSharp.WinForms" Version="3.9.4" /> <PackageReference Include="LibVLCSharp.WinForms" Version="4.0.0-alpha-20250825-9139" />
<PackageReference Include="MySqlConnector" Version="2.4.0" /> <PackageReference Include="MySqlConnector" Version="2.4.0" />
<PackageReference Include="System.Data.SQLite.Core" Version="1.0.117" /> <PackageReference Include="System.Data.SQLite.Core" Version="1.0.117" />
<PackageReference Include="System.IO.Ports" Version="9.0.3" /> <PackageReference Include="System.IO.Ports" Version="9.0.3" />
<PackageReference Include="VideoLAN.LibVLC.Windows" Version="3.0.21" /> <PackageReference Include="VideoLAN.LibVLC.Windows" Version="4.0.0-alpha-20250825" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Reference Include="AxInterop.WMPLib"> <Reference Include="AxInterop.WMPLib">

216
superstar.csproj.user Normal file
View File

@ -0,0 +1,216 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup />
<ItemGroup>
<Compile Update="ImagePanel.cs">
<SubType>Component</SubType>
</Compile>
<Compile Update="OverlayFormObj\OverlayForm.cs">
<SubType>Form</SubType>
</Compile>
<Compile Update="OverlayFormObj\OverlayForm.Helpers.cs">
<SubType>Form</SubType>
</Compile>
<Compile Update="OverlayFormObj\OverlayForm.Labels.cs">
<SubType>Form</SubType>
</Compile>
<Compile Update="PrimaryFormParts\CategorySearch\PrimaryForm.CategorySearch.ChinaSongs.cs">
<SubType>Form</SubType>
</Compile>
<Compile Update="PrimaryFormParts\CategorySearch\PrimaryForm.CategorySearch.cs">
<SubType>Form</SubType>
</Compile>
<Compile Update="PrimaryFormParts\CategorySearch\PrimaryForm.CategorySearch.LoveDuet.cs">
<SubType>Form</SubType>
</Compile>
<Compile Update="PrimaryFormParts\CategorySearch\PrimaryForm.CategorySearch.MedleyDance.cs">
<SubType>Form</SubType>
</Compile>
<Compile Update="PrimaryFormParts\CategorySearch\PrimaryForm.CategorySearch.Nineties.cs">
<SubType>Form</SubType>
</Compile>
<Compile Update="PrimaryFormParts\CategorySearch\PrimaryForm.CategorySearch.NostalgicSongs.cs">
<SubType>Form</SubType>
</Compile>
<Compile Update="PrimaryFormParts\CategorySearch\PrimaryForm.CategorySearch.TalentShow.cs">
<SubType>Form</SubType>
</Compile>
<Compile Update="PrimaryFormParts\CategorySearch\PrimaryForm.CategorySearch.VietnameseSongs.cs">
<SubType>Form</SubType>
</Compile>
<Compile Update="PrimaryFormParts\GroupSearch\PrimaryForm.GroupSearch.cs">
<SubType>Form</SubType>
</Compile>
<Compile Update="PrimaryFormParts\GroupSearch\PrimaryForm.GroupSearch.GuoYu.cs">
<SubType>Form</SubType>
</Compile>
<Compile Update="PrimaryFormParts\GroupSearch\PrimaryForm.GroupSearch.HanYu.cs">
<SubType>Form</SubType>
</Compile>
<Compile Update="PrimaryFormParts\GroupSearch\PrimaryForm.GroupSearch.RiYu.cs">
<SubType>Form</SubType>
</Compile>
<Compile Update="PrimaryFormParts\GroupSearch\PrimaryForm.GroupSearch.TaiYu.cs">
<SubType>Form</SubType>
</Compile>
<Compile Update="PrimaryFormParts\GroupSearch\PrimaryForm.GroupSearch.YingYu.cs">
<SubType>Form</SubType>
</Compile>
<Compile Update="PrimaryFormParts\GroupSearch\PrimaryForm.GroupSearch.YueYu.cs">
<SubType>Form</SubType>
</Compile>
<Compile Update="PrimaryFormParts\HotSong\PrimaryForm.HotSong.cs">
<SubType>Form</SubType>
</Compile>
<Compile Update="PrimaryFormParts\HotSong\PrimaryForm.HotSongChinese.cs">
<SubType>Form</SubType>
</Compile>
<Compile Update="PrimaryFormParts\HotSong\PrimaryForm.HotSongEnglish.cs">
<SubType>Form</SubType>
</Compile>
<Compile Update="PrimaryFormParts\HotSong\PrimaryForm.HotSongJapanese.cs">
<SubType>Form</SubType>
</Compile>
<Compile Update="PrimaryFormParts\HotSong\PrimaryForm.HotSongKorean.cs">
<SubType>Form</SubType>
</Compile>
<Compile Update="PrimaryFormParts\HotSong\PrimaryForm.HotSongMandarinNew.cs">
<SubType>Form</SubType>
</Compile>
<Compile Update="PrimaryFormParts\HotSong\PrimaryForm.HotSongTaiwanese.cs">
<SubType>Form</SubType>
</Compile>
<Compile Update="PrimaryFormParts\HotSong\PrimaryForm.HotSongTaiwaneseNew.cs">
<SubType>Form</SubType>
</Compile>
<Compile Update="PrimaryFormParts\LanguageSearch\PrimaryForm.LanguageSearch.cs">
<SubType>Form</SubType>
</Compile>
<Compile Update="PrimaryFormParts\LanguageSearch\PrimaryForm.LanguageSearch.GuoYu.cs">
<SubType>Form</SubType>
</Compile>
<Compile Update="PrimaryFormParts\LanguageSearch\PrimaryForm.LanguageSearch.HanYu.cs">
<SubType>Form</SubType>
</Compile>
<Compile Update="PrimaryFormParts\LanguageSearch\PrimaryForm.LanguageSearch.KeYu.cs">
<SubType>Form</SubType>
</Compile>
<Compile Update="PrimaryFormParts\LanguageSearch\PrimaryForm.LanguageSearch.RiYu.cs">
<SubType>Form</SubType>
</Compile>
<Compile Update="PrimaryFormParts\LanguageSearch\PrimaryForm.LanguageSearch.TaiYu.cs">
<SubType>Form</SubType>
</Compile>
<Compile Update="PrimaryFormParts\LanguageSearch\PrimaryForm.LanguageSearch.YingWen.cs">
<SubType>Form</SubType>
</Compile>
<Compile Update="PrimaryFormParts\LanguageSearch\PrimaryForm.LanguageSearch.YueYu.cs">
<SubType>Form</SubType>
</Compile>
<Compile Update="PrimaryFormParts\NewSongAlert\PrimaryForm.NewSongAlert.cs">
<SubType>Form</SubType>
</Compile>
<Compile Update="PrimaryFormParts\NewSongAlert\PrimaryForm.NewSongAlertCantonese.cs">
<SubType>Form</SubType>
</Compile>
<Compile Update="PrimaryFormParts\NewSongAlert\PrimaryForm.NewSongAlertChinese.cs">
<SubType>Form</SubType>
</Compile>
<Compile Update="PrimaryFormParts\NewSongAlert\PrimaryForm.NewSongAlertEnglish.cs">
<SubType>Form</SubType>
</Compile>
<Compile Update="PrimaryFormParts\NewSongAlert\PrimaryForm.NewSongAlertJapanese.cs">
<SubType>Form</SubType>
</Compile>
<Compile Update="PrimaryFormParts\NewSongAlert\PrimaryForm.NewSongAlertKorean.cs">
<SubType>Form</SubType>
</Compile>
<Compile Update="PrimaryFormParts\NewSongAlert\PrimaryForm.NewSongAlertTaiwanese.cs">
<SubType>Form</SubType>
</Compile>
<Compile Update="PrimaryFormParts\PrimaryForm.cs">
<SubType>Form</SubType>
</Compile>
<Compile Update="PrimaryFormParts\PrimaryForm.Favorite.cs">
<SubType>Form</SubType>
</Compile>
<Compile Update="PrimaryFormParts\PrimaryForm.MultiPagePanel.cs">
<SubType>Form</SubType>
</Compile>
<Compile Update="PrimaryFormParts\PrimaryForm.OrderedSongs.cs">
<SubType>Form</SubType>
</Compile>
<Compile Update="PrimaryFormParts\PrimaryForm.Promotions.cs">
<SubType>Form</SubType>
</Compile>
<Compile Update="PrimaryFormParts\PrimaryForm.PromotionsAndMenuPanel.cs">
<SubType>Form</SubType>
</Compile>
<Compile Update="PrimaryFormParts\PrimaryForm.QRCode.cs">
<SubType>Form</SubType>
</Compile>
<Compile Update="PrimaryFormParts\PrimaryForm.SequenceManager.cs">
<SubType>Form</SubType>
</Compile>
<Compile Update="PrimaryFormParts\PrimaryForm.SoundEffects.cs">
<SubType>Form</SubType>
</Compile>
<Compile Update="PrimaryFormParts\PrimaryForm.SQLSearch.cs">
<SubType>Form</SubType>
</Compile>
<Compile Update="PrimaryFormParts\PrimaryForm.SyncScreen.cs">
<SubType>Form</SubType>
</Compile>
<Compile Update="PrimaryFormParts\PrimaryForm.ToggleLight.cs">
<SubType>Form</SubType>
</Compile>
<Compile Update="PrimaryFormParts\PrimaryForm.VodScreen.cs">
<SubType>Form</SubType>
</Compile>
<Compile Update="PrimaryFormParts\SingerSearch\PrimaryForm.SingerSearch.BopomofoSearch.cs">
<SubType>Form</SubType>
</Compile>
<Compile Update="PrimaryFormParts\SingerSearch\PrimaryForm.SingerSearch.cs">
<SubType>Form</SubType>
</Compile>
<Compile Update="PrimaryFormParts\SingerSearch\PrimaryForm.SingerSearch.EnglishSearch.cs">
<SubType>Form</SubType>
</Compile>
<Compile Update="PrimaryFormParts\SingerSearch\PrimaryForm.SingerSearch.HandwritingSearch.cs">
<SubType>Form</SubType>
</Compile>
<Compile Update="PrimaryFormParts\SingerSearch\PrimaryForm.SingerSearch.PinyinSearch.cs">
<SubType>Form</SubType>
</Compile>
<Compile Update="PrimaryFormParts\SingerSearch\PrimaryForm.SingerSearch.WordCountSearch.cs">
<SubType>Form</SubType>
</Compile>
<Compile Update="PrimaryFormParts\SongSearch\PrimaryForm.SongSearch.BopomofoSearch.cs">
<SubType>Form</SubType>
</Compile>
<Compile Update="PrimaryFormParts\SongSearch\PrimaryForm.SongSearch.cs">
<SubType>Form</SubType>
</Compile>
<Compile Update="PrimaryFormParts\SongSearch\PrimaryForm.SongSearch.EnglishSearch.cs">
<SubType>Form</SubType>
</Compile>
<Compile Update="PrimaryFormParts\SongSearch\PrimaryForm.SongSearch.HandwritingSearch.cs">
<SubType>Form</SubType>
</Compile>
<Compile Update="PrimaryFormParts\SongSearch\PrimaryForm.SongSearch.NumberSearch.cs">
<SubType>Form</SubType>
</Compile>
<Compile Update="PrimaryFormParts\SongSearch\PrimaryForm.SongSearch.PinyinSearch.cs">
<SubType>Form</SubType>
</Compile>
<Compile Update="PrimaryFormParts\SongSearch\PrimaryForm.SongSearch.WordCountSearch.cs">
<SubType>Form</SubType>
</Compile>
<Compile Update="PromotionsAndMenuPanel.cs">
<SubType>Component</SubType>
</Compile>
<Compile Update="VideoPlayerForm.cs">
<SubType>Form</SubType>
</Compile>
</ItemGroup>
</Project>