調整 多餘資料 20250721
This commit is contained in:
parent
e1d7653a1a
commit
36ab52bac1
@ -1,12 +0,0 @@
|
||||
namespace DualScreenDemo
|
||||
{
|
||||
|
||||
public enum ClickSequenceState
|
||||
{
|
||||
Initial,
|
||||
FirstClicked,
|
||||
SecondClicked,
|
||||
ThirdClicked,
|
||||
Completed
|
||||
}
|
||||
}
|
@ -540,8 +540,9 @@ namespace DualScreenDemo
|
||||
ClearDisplay();
|
||||
|
||||
// 設定歌曲總數為已播放歌曲的數量
|
||||
List<SongData> historySongs = SongList.GetHistory();
|
||||
OverlayForm.MainForm.totalSongs = historySongs.Count;
|
||||
List<SongData> history= SongList.GetHistory();
|
||||
List<SongData> historySongs = new List<SongData>();
|
||||
OverlayForm.MainForm.totalSongs = SongList.GetHistory().Count;
|
||||
|
||||
// 若無任何播放紀錄,直接顯示訊息並返回,不執行後續動作
|
||||
if (OverlayForm.MainForm.totalSongs == 0)
|
||||
@ -558,6 +559,9 @@ namespace DualScreenDemo
|
||||
int endIndex = Math.Min(startIndex + OverlayForm.MainForm.songsPerPage, OverlayForm.MainForm.totalSongs);
|
||||
|
||||
// 準備要傳給 UpdateHistoryLabel 的兩個清單:歌曲資料與播放狀態
|
||||
for (int i = startIndex; i < endIndex; i++) {
|
||||
historySongs.Add(history[i]);
|
||||
}
|
||||
|
||||
// 錨點 遙控器
|
||||
|
||||
|
59
DBObj/MyDB.cs
Normal file
59
DBObj/MyDB.cs
Normal file
@ -0,0 +1,59 @@
|
||||
using System;
|
||||
using System.Data;
|
||||
using MySqlConnector;
|
||||
|
||||
namespace DBObj
|
||||
{
|
||||
public class MyDB : IDisposable
|
||||
{
|
||||
private readonly string connectionString = Utils.Env.GetDBConnection();
|
||||
private MySqlConnection conn;
|
||||
|
||||
public MyDB()
|
||||
{
|
||||
conn = new MySqlConnection(connectionString);
|
||||
conn.Open();
|
||||
Console.WriteLine("MyDB 連線成功!");
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
if (conn != null)
|
||||
{
|
||||
conn.Close();
|
||||
Console.WriteLine("MyDB 連線已關閉!");
|
||||
}
|
||||
}
|
||||
|
||||
// SELECT 方法
|
||||
public DataTable Select(string query, MySqlParameter[] parameters)
|
||||
{
|
||||
using (var cmd = new MySqlCommand(query, conn))
|
||||
{
|
||||
if (parameters != null)
|
||||
{
|
||||
cmd.Parameters.AddRange(parameters);
|
||||
}
|
||||
using (var adapter = new MySqlDataAdapter(cmd))
|
||||
{
|
||||
DataTable result = new DataTable();
|
||||
adapter.Fill(result);
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// INSERT / UPDATE / DELETE 方法
|
||||
public int ExecuteNonQuery(string query, MySqlParameter[] parameters)
|
||||
{
|
||||
using (var cmd = new MySqlCommand(query, conn))
|
||||
{
|
||||
if (parameters != null)
|
||||
{
|
||||
cmd.Parameters.AddRange(parameters);
|
||||
}
|
||||
return cmd.ExecuteNonQuery();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -1,9 +1,11 @@
|
||||
using System.Data;
|
||||
using DualScreenDemo;
|
||||
namespace DBObj
|
||||
{
|
||||
public class SongListManager
|
||||
{
|
||||
public List<SongData> FavoriteSongs { get; private set; }
|
||||
private MyDB db = new MyDB();
|
||||
public List<SongData> FavoriteSongs { get; private set; }
|
||||
//public bool IsUserLoggedIn { get; set; }
|
||||
//public string UserPhoneNumber { get; set; }
|
||||
public SongListManager()
|
||||
@ -76,6 +78,32 @@ namespace DBObj
|
||||
var searchResults =PrimaryForm.Instance.SearchSongs_Mysql(query);
|
||||
return searchResults.FirstOrDefault();
|
||||
}
|
||||
private List<SongData> select_Mysql(string query)
|
||||
{
|
||||
List<SongData> searchResults = new List<SongData>();
|
||||
Console.WriteLine(query);
|
||||
using (db)
|
||||
{
|
||||
DataTable result = db.Select(query, null);
|
||||
foreach (DataRow row in result.Rows)
|
||||
{
|
||||
searchResults.Add(new SongData(
|
||||
row["song_id"].ToString(),
|
||||
row["song_name"].ToString(),
|
||||
row["artistA"].ToString(),
|
||||
row["artistB"].ToString(),
|
||||
row["song_filename"].ToString(),
|
||||
row["artistA_simplified"].ToString(),
|
||||
row["artistB_simplified"].ToString(),
|
||||
row["song_simplified"].ToString(),
|
||||
Convert.ToInt32(row["vocal"])
|
||||
));
|
||||
}
|
||||
Console.WriteLine($"查詢到 {searchResults.Count} 筆資料。");
|
||||
}
|
||||
|
||||
return searchResults;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
@ -1,10 +0,0 @@
|
||||
namespace DualScreenDemo.Shared
|
||||
{
|
||||
public class VideoStatus
|
||||
{
|
||||
public bool IsGraphOk { get; set; }
|
||||
public string LastError { get; set; }
|
||||
public double PositionSeconds { get; set; }
|
||||
public string PlayState { get; set; }
|
||||
}
|
||||
}
|
@ -1,52 +0,0 @@
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Runtime.InteropServices.ComTypes;
|
||||
using DirectShowLib;
|
||||
|
||||
namespace DualScreenDemo
|
||||
{
|
||||
public class FilterEnumerator
|
||||
{
|
||||
private static readonly Guid IID_IPropertyBag = new Guid("55272A00-42CB-11CE-8135-00AA004BB851");
|
||||
|
||||
public void EnumerateFilters()
|
||||
{
|
||||
ICreateDevEnum createDevEnum = (ICreateDevEnum)new CreateDevEnum();
|
||||
IEnumMoniker enumMoniker;
|
||||
int hr = createDevEnum.CreateClassEnumerator(FilterCategory.LegacyAmFilterCategory, out enumMoniker, 0);
|
||||
if (hr != 0 || enumMoniker == null)
|
||||
{
|
||||
Console.WriteLine("No filters found.");
|
||||
return;
|
||||
}
|
||||
|
||||
IMoniker[] monikers = new IMoniker[1];
|
||||
IntPtr fetched = Marshal.AllocHGlobal(sizeof(int));
|
||||
while (enumMoniker.Next(1, monikers, fetched) == 0)
|
||||
{
|
||||
int fetchedCount = Marshal.ReadInt32(fetched);
|
||||
if (fetchedCount > 0)
|
||||
{
|
||||
object objPropBag;
|
||||
Guid tempGuid = IID_IPropertyBag;
|
||||
monikers[0].BindToStorage(null, null, ref tempGuid, out objPropBag);
|
||||
IPropertyBag propBag = objPropBag as IPropertyBag;
|
||||
|
||||
object filterName = null;
|
||||
if (propBag != null)
|
||||
{
|
||||
propBag.Read("FriendlyName", out filterName, null);
|
||||
}
|
||||
|
||||
if (filterName != null)
|
||||
{
|
||||
Console.WriteLine("Filter: " + filterName.ToString());
|
||||
}
|
||||
|
||||
Marshal.ReleaseComObject(monikers[0]);
|
||||
}
|
||||
}
|
||||
Marshal.ReleaseComObject(enumMoniker);
|
||||
Marshal.FreeHGlobal(fetched);
|
||||
}
|
||||
}
|
||||
}
|
@ -1,8 +0,0 @@
|
||||
namespace DualScreenDemo
|
||||
{
|
||||
public static class FormatTypes
|
||||
{
|
||||
public static readonly Guid VideoInfo = new Guid("05589F80-C356-11CE-BF01-00AA0055595A");
|
||||
public static readonly Guid WaveEx = new Guid("05589f81-c356-11ce-bf01-00aa0055595a");
|
||||
}
|
||||
}
|
@ -1,5 +0,0 @@
|
||||
public static class MediaSubTypes
|
||||
{
|
||||
public static readonly Guid YUY2 = new Guid("32595559-0000-0010-8000-00AA00389B71");
|
||||
public static readonly Guid IEEE_FLOAT = new Guid("00000003-0000-0010-8000-00AA00389B71");
|
||||
}
|
@ -1,8 +0,0 @@
|
||||
namespace DualScreenDemo
|
||||
{
|
||||
public static class MediaTypes
|
||||
{
|
||||
public static readonly Guid Video = new Guid("73646976-0000-0010-8000-00AA00389B71");
|
||||
public static readonly Guid Audio = new Guid("73647561-0000-0010-8000-00AA00389B71");
|
||||
}
|
||||
}
|
@ -7,7 +7,7 @@ namespace OverlayFormObj
|
||||
public partial class OverlayForm
|
||||
{
|
||||
public Label displayLabel;
|
||||
public Label songDisplayLabel;
|
||||
//public Label songDisplayLabel;
|
||||
private List<Label> displayLabels;
|
||||
public Label pauseLabel;
|
||||
public Label muteLabel; // New mute label
|
||||
|
@ -17,7 +17,7 @@ namespace DualScreenDemo
|
||||
[STAThread]
|
||||
static void Main()
|
||||
{
|
||||
Console.WriteLine("Server V.1.2.3 202507211300");
|
||||
Console.WriteLine("Server V.1.2.3 202507211828");
|
||||
if (Utils.Env.GetBool("IsCursor", true)) Cursor.Hide();
|
||||
AppDomain.CurrentDomain.ProcessExit += (s, e) => Cursor.Show();
|
||||
//Console.WriteLine("正在與中控取得聯繫...");
|
||||
@ -49,7 +49,7 @@ namespace DualScreenDemo
|
||||
}
|
||||
|
||||
// 啟動服務器
|
||||
|
||||
var TCP = new TCPServer();
|
||||
Task.Run(() => HttpServerManager.StartServer());
|
||||
|
||||
// 註冊事件
|
||||
@ -88,8 +88,6 @@ namespace DualScreenDemo
|
||||
}
|
||||
primaryForm.Show();
|
||||
Application.Run(primaryForm);
|
||||
|
||||
var TCP = new TCPServer();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
|
@ -1,12 +0,0 @@
|
||||
namespace DualScreenDemo
|
||||
{
|
||||
public enum RemoteCommand
|
||||
{
|
||||
NextPage,
|
||||
PreviousPage,
|
||||
Play,
|
||||
Pause,
|
||||
Stop
|
||||
|
||||
}
|
||||
}
|
@ -1,7 +0,0 @@
|
||||
namespace DualScreenDemo
|
||||
{
|
||||
public class RemoteControlEventArgs : EventArgs
|
||||
{
|
||||
public RemoteCommand Command { get; set; }
|
||||
}
|
||||
}
|
@ -1,8 +0,0 @@
|
||||
namespace DualScreenDemo
|
||||
{
|
||||
public class RequestData
|
||||
{
|
||||
public string buttonId { get; set; }
|
||||
public string text { get; set; }
|
||||
}
|
||||
}
|
@ -1,26 +0,0 @@
|
||||
using DirectShowLib;
|
||||
|
||||
namespace DualScreenDemo
|
||||
{
|
||||
public class SampleGrabberCallback : ISampleGrabberCB
|
||||
{
|
||||
private VideoPlayerForm form;
|
||||
|
||||
public SampleGrabberCallback(VideoPlayerForm form)
|
||||
{
|
||||
this.form = form;
|
||||
}
|
||||
|
||||
public int BufferCB(double SampleTime, IntPtr pBuffer, int BufferLen)
|
||||
{
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
public int SampleCB(double SampleTime, IMediaSample pSample)
|
||||
{
|
||||
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
@ -3,7 +3,6 @@ using System.Runtime.InteropServices;
|
||||
using DirectShowLib;
|
||||
using DBObj;
|
||||
using OverlayFormObj;
|
||||
using DualScreenDemo.Shared;
|
||||
namespace DualScreenDemo
|
||||
{
|
||||
public class VideoPlayerForm : Form
|
||||
@ -131,26 +130,7 @@ namespace DualScreenDemo
|
||||
}
|
||||
CheckMonitor();
|
||||
}
|
||||
/*
|
||||
protected override void OnShown(EventArgs e)
|
||||
{
|
||||
base.OnShown(e);
|
||||
try
|
||||
{
|
||||
if (secondMonitor != null)
|
||||
{
|
||||
SetWindowPos(this.Handle, IntPtr.Zero, secondMonitor.Bounds.X, secondMonitor.Bounds.Y,
|
||||
secondMonitor.Bounds.Width, secondMonitor.Bounds.Height, 0);
|
||||
}
|
||||
IntPtr exStyle = GetWindowLong(this.Handle, GWL_EXSTYLE);
|
||||
SetWindowLong(this.Handle, GWL_EXSTYLE, (IntPtr)(exStyle.ToInt32()));
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine("An error occurred in OnShown: " + ex.Message);
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
private void VideoPlayerForm_Shown(object sender, EventArgs e)
|
||||
{
|
||||
int hr = CoInitializeEx(IntPtr.Zero, COINIT.APARTMENTTHREADED);
|
||||
@ -284,23 +264,6 @@ namespace DualScreenDemo
|
||||
}
|
||||
}
|
||||
|
||||
/*private void ConfigureSampleGrabber(IBaseFilter sampleGrabberFilter)
|
||||
{
|
||||
ISampleGrabber sampleGrabber = (ISampleGrabber)sampleGrabberFilter;
|
||||
AMMediaType mediaType = new AMMediaType
|
||||
{
|
||||
majorType = MediaType.Video,
|
||||
subType = MediaSubType.RGB24,
|
||||
formatType = FormatType.VideoInfo
|
||||
};
|
||||
sampleGrabber.SetMediaType(mediaType);
|
||||
DsUtils.FreeAMMediaType(mediaType);
|
||||
|
||||
sampleGrabber.SetBufferSamples(false);
|
||||
sampleGrabber.SetOneShot(false);
|
||||
sampleGrabber.SetCallback(new SampleGrabberCallback(this), 1);
|
||||
}*/
|
||||
|
||||
private int ConnectFilters(IGraphBuilder graphBuilder, IBaseFilter sourceFilter, string sourcePinName, IBaseFilter destFilter, string destPinName)
|
||||
{
|
||||
IPin outPin = FindPin(sourceFilter, sourcePinName);
|
||||
@ -517,38 +480,6 @@ namespace DualScreenDemo
|
||||
overlayForm.DisplayBarrage(text);
|
||||
}
|
||||
|
||||
/*
|
||||
public static async Task UpdateMarqueeTextForNextSong(SongData song)
|
||||
{
|
||||
string nextSongText = String.Format("下一首3:{0}", song.Name);
|
||||
|
||||
if (overlayForm.InvokeRequired)
|
||||
{
|
||||
overlayForm.Invoke(new MethodInvoker(() =>
|
||||
{
|
||||
overlayForm.UpdateMarqueeText(nextSongText, OverlayForm.MarqueeStartPosition.Middle, Color.White);
|
||||
}));
|
||||
}
|
||||
else
|
||||
{
|
||||
overlayForm.UpdateMarqueeText(nextSongText, OverlayForm.MarqueeStartPosition.Middle, Color.White);
|
||||
}
|
||||
await Task.Delay(5000);
|
||||
|
||||
// 重置跑马灯文本
|
||||
if (overlayForm.InvokeRequired)
|
||||
{
|
||||
overlayForm.Invoke(new MethodInvoker(() =>
|
||||
{
|
||||
overlayForm.ResetMarqueeTextToWelcomeMessage();
|
||||
}));
|
||||
}
|
||||
else
|
||||
{
|
||||
overlayForm.ResetMarqueeTextToWelcomeMessage();
|
||||
}
|
||||
}
|
||||
*/
|
||||
public async Task PlayNextSong()
|
||||
{
|
||||
// 等待初始化完成(例如播放器、串口等資源尚未就緒時)
|
||||
@ -1158,72 +1089,6 @@ namespace DualScreenDemo
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
public VideoStatus GetCurrentVideoStatus()
|
||||
{
|
||||
var status = new VideoStatus();
|
||||
try
|
||||
{
|
||||
IMediaSeeking mediaSeekingSecondary = graphBuilderSecondary as IMediaSeeking;
|
||||
if (mediaSeekingSecondary != null)
|
||||
{
|
||||
long position;
|
||||
if (mediaSeekingSecondary.GetCurrentPosition(out position) >= 0)
|
||||
{
|
||||
status.PositionSeconds = position / 10000000.0;
|
||||
}
|
||||
else
|
||||
{
|
||||
status.LastError = "無法取得影片播放位置";
|
||||
status.PositionSeconds = -1;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
status.LastError = "mediaSeekingSecondary 物件為 null";
|
||||
status.PositionSeconds = -1;
|
||||
}
|
||||
|
||||
if (mediaControlSecondary != null)
|
||||
{
|
||||
FilterState stateCode;
|
||||
int hr = mediaControlSecondary.GetState(100, out stateCode);
|
||||
if (hr >= 0)
|
||||
{
|
||||
var state = (FilterState)stateCode;
|
||||
status.PlayState = state.ToString();
|
||||
status.LastError = state.ToString();
|
||||
status.IsGraphOk = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
status.PlayState = "無法取得播放狀態";
|
||||
status.LastError = "無法取得播放狀態";
|
||||
status.IsGraphOk = false;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
status.PlayState = "mediaControlSecondary 物件為 null";
|
||||
status.LastError = "mediaControlSecondary 物件為 null";
|
||||
status.IsGraphOk = false;
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
status.LastError = "取得影片狀態時發生例外:" + ex.Message;
|
||||
status.PositionSeconds = -1;
|
||||
status.PlayState = "Error";
|
||||
status.IsGraphOk = false;
|
||||
}
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1,8 +0,0 @@
|
||||
namespace DualScreenDemo
|
||||
{
|
||||
public static class WindowStyles
|
||||
{
|
||||
public const int WS_CHILD = 0x40000000;
|
||||
public const int WS_CLIPSIBLINGS = 0x04000000;
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user