PDA

View Full Version : SoundPlayer in C# + Yek Soal



HosseinProgrammer
چهارشنبه 31 مرداد 1386, 12:07 عصر
سلام. من چند تا سوال از سی شارپ دارم. خیلی ممنون میشم اگر جواب بدید.

1- توی سی پلاس پلاس یه تابع داریم به نام Delay که کارش وقفه انداختن بین اجرای دستوراته طوری که CPU رو درگیر نمیکنه. معادلش در سی شارپ چیه؟ اگه باید از تایمر استفاده کنم، چگونه؟

2- من یک کلاس دارم که کنترل های یک فرم در آن تعریف شده است. مثلا یک کنترل Label که public هم تعریف شده، رو میخوام در یک کلاس دیگه استفاده کنم. لازمه بگم که یک شی از کلاس اول ایجاد کردم و خواستم بصورت زیر خصوصیت Text لیبل را تنظیم کنم. ولی هیچ تغییری در اون لیبل نمیبینم! مشکل کجاست؟

Class1 A = new Class1();
A.label1.Text = "Ali";

3- وقتی از System.Media.SoundPlayer استفاده میکنم میخواهم بدونم که فایل صوتی که load کردم چند ثانیه است؟ یعنی:

SoundPlayer Player = new SoundPlayer();
Player.SoundLocation = "آدرس فایل";

حالا این فایلی که لود شده، چند ثانیه است؟

4- سوال چهارم در رابطه با سوال سومه. وقتی یک فایل لود شد، آیا میشه کاری کرد که دستورات متوقف بشه تا کل فایل پخش بشه و سپس دستورات ادامه پیدا کنه؟!

---------------------------
توضیحات بیشتر:

در مورد سوال دوم:
من بخش هایی از برنامه رو اینجا کپی میکنم.
برنامه Form1:
f های اضافی رو در نظر نگیرید . برای اصلاح ادیتور گذاشتمشون. ضمنا آکولادها هم برعکس نشون داده شده. }{

publicpartialclassForm1 : Form

}

public Form1() f

{

InitializeComponent();

}

privatevoid button1_Click(object sender, EventArgs e)

{

Class2 B = newClass2(); f

B.Function(); f

}

-----------------------------------------------------------

classClass2

{

publicvoid Function() f

{

Form1 C = newForm1(); f

C.label1.Text = "Salam"; f

}

}

staticclassProgram

{

///

/// The main entry point for the application.

///

[STAThread]

staticvoid Main()

{

Application.EnableVisualStyles();

Application.SetCompatibleTextRenderingDefault(fals e);

Application.Run(newForm1());

}

}

-----------------------------------------------------------------------

در Form Designer
private System.Windows.Forms.Button button1;
public System.Windows.Forms.Label label1;
ولی با کلیک روی Button هیچ تغییری در label ایجاد نمیشه! واقعا چرا؟!
------------------------------------------------------------
در مورد سوال سوم و چهارم:
Duration متاسفانه وجود نداشت. در حقیقت چیزی که توی سوال چهارم میخوام ترکیب سوال یک و سه هستش. کد زیر رو ببینید تا بیشتر توضیح بدم:

using System.Media;


int x = 5;
int y = 2;
x = x*y;

if( x==10 ){
SoundPlayer Player = new SoundPlayer();
Player.SoundLocation = "آدرس";
Player.Play();
x = 3;
}
y = 4;

من میخوام دستوری باشه که وقتی Player.Play اجرا شد، کامپایلر اونقدر وایسه تا پخش فایل صوتی تموم بشه. یعنی باید به مدت زمان فایل صوتی متوقف بشه و x=3 انجام نشه. برای اینکار اگه بخوام خودم انجام بدم باید مدت زمان فایلی که داره پخش میشه رو بدونم تا با Sleep کامپایلر رو متوقف کنم. لازمه بگم که مدت زمان فایل صوتی رو از قبل نمیدونم و وقتی که لود شد باید بفهمم.
امیدوارم منظورمو رسونده باشم. تو سوال چهار هم دقیقا همینو میخوام.
اگه بتونید کمکم کنید که واقعا ممنون میشم.

PC2st
چهارشنبه 31 مرداد 1386, 12:34 عصر
1. استفاده از متد زیر برای یک ثانیه توقف:


System.Threading.Thread.Sleep(1000);

اگر واقعا احتیاج داشتید این کار رو بکنید چون میگن روش درستی نیست :بامزه:

2. باید هم اینطور بشه، چون شیئ C که در متد Function ایجاد میکنید، با فرمی که در حال حاضر به نمایش گذاشته شده، فرق میکنه، باید کدتون رو به شکل دیگری تغییر بدید:


public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Class2 B = new Class2();
B.Function(this);
}
}
class Class2
{
public void Function(Form1 frm)
{
Form1 C = frm;
C.label1.Text = "Salam";
}
}


3. قبلا یک نگاه کرده بودم، به نظر نمیشه مقدار زمان کل آهنگ رو بدست آورد.
بجاش از کنترل Windows Media Player استفاده کنید.

4. بله باید از Threading استفاده کنید.


من میخوام دستوری باشه که وقتی Player.Play اجرا شد، کامپایلر اونقدر وایسه تا پخش فایل صوتی تموم بشه. یعنی باید به مدت زمان فایل صوتی متوقف بشه و x=3 انجام نشه. برای اینکار اگه بخوام خودم انجام بدم باید مدت زمان فایلی که داره پخش میشه رو بدونم تا با Sleep کامپایلر رو متوقف کنم.
پیشنهاد میکنم از Threading برای اینکار استفاده کنید :-)

PC2st
چهارشنبه 31 مرداد 1386, 13:25 عصر
برای استفاده از Threading به جای Sleep مثال زیر رو ببین که یک Console Application هست:


using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
System.Threading.Thread th = new System.Threading.Thread(new System.Threading.ThreadStart(DoWork));
th.Start();
th.Join();
Console.WriteLine("It's will be write when th Thread completed.");
Console.ReadKey();
}

static void DoWork()
{
for (int index = 0; index < 50; index++)
Console.WriteLine(index);
}
}
}

کد فوق رو یکبار با متد Join و یکبار بدون متد Join اجرا کنید، خودتون متوجه میشید.

PC2st
چهارشنبه 31 مرداد 1386, 14:20 عصر
گفتم شاید بهتر باشه اصلا یک نمونه برات بگذارم!
به جای متد Play باید از PlaySync استفاده کنید.
برنامه منتظر میماند تا کار پخش SoundPlayer تمام بشه:


SoundPlayer sound = new SoundPlayer("winSpaceSysStart.wav");
System.Threading.Thread th = new System.Threading.Thread(new System.Threading.ThreadStart(sound.PlaySync));
th.Start();
th.Join();
MessageBox.Show("Finish");

mehdi.mousavi
چهارشنبه 31 مرداد 1386, 14:27 عصر
1. استفاده از متد زیر برای یک ثانیه توقف:


System.Threading.Thread.Sleep(1000);
اگر واقعا احتیاج داشتید این کار رو بکنید چون میگن روش درستی نیست :بامزه:



سلام.
دقت کنید که من گفتم استفاده از Sleep برای همزمان کردن Thread ها، صحیح نیست. یعنی اینکه بگید اینجا یه وقفه میندازم که فلان چیز برسه انجام بشه و ... و الا اگر هدف فقط ایجاد وقفه باشه که خوب مشکلی نیست. :)

PC2st
چهارشنبه 31 مرداد 1386, 14:32 عصر
دقت کنید که من گفتم استفاده از Sleep برای همزمان کردن Thread ها، صحیح نیست. یعنی اینکه بگید اینجا یه وقفه میندازم که فلان چیز برسه انجام بشه و ... و الا اگر هدف فقط ایجاد وقفه باشه که خوب مشکلی نیست. :)
آهان،...!
الان دقت کردم فهمیدم منظورتون چی بوده :لبخند:
بله، کاملا موافقم.

HosseinProgrammer
چهارشنبه 31 مرداد 1386, 16:46 عصر
گفتم شاید بهتر باشه اصلا یک نمونه برات بگذارم!
به جای متد Play باید از PlaySync استفاده کنید.
برنامه منتظر میماند تا کار پخش SoundPlayer تمام بشه:


SoundPlayer sound = new SoundPlayer("winSpaceSysStart.wav");
System.Threading.Thread th = new System.Threading.Thread(new System.Threading.ThreadStart(sound.PlaySync));
th.Start();
th.Join();
MessageBox.Show("Finish");


واقعا ممنون از راهنماییهاتون. خیلی کمکم کرد. فقط یه سوال دارم و اون اینه که من میخوام از این Thread در چند جای برنامه استفاده کنم. یعنی فایل ها مختلفی رو اجرا کنم. یک بار بالای برنامه این رو نوشتم:


SoundPlayer Player = newSoundPlayer();
System.Threading.Thread th = new System.Threading.Thread(
new System.Threading.ThreadStart(Player.PlaySync));


بعد در جاهای مختلف برنامه این کد رو نوشتم:


Player.SoundLocation = "آدرس فایل";
th.Start();
th.Join();


ولی با چنین خطایی در حین اجرا روبرو میشم:

Thread is running terminated; it cannot restart

ولی اینطوری حل میشه:


th = new System.Threading.Thread(
new System.Threading.ThreadStart(Player.PlaySync));


میدونم که باید اینکارو هردفعه انجام بدم. ولی دو تا سوال دارم:

1- بدون روش بالا ، کاری نمیشه کرد؟ مگه این Thread کارش Play کردن فایل صوتی که در آدرس Player هستش نیست؟ (ببخشید اگه سوال غیر حرفه ای میکنم! چون با Thread ها خیلی آشنا نیستم. ولی اگه برام توضیح بدین ممنون میشم.)

2- با اینکه ابتدا و انتهای فایل های صوتی ، فضای خالی نیست (کل تایم فایل پره) ، ولی فاصله بین پخش دو Thread چندان جالب نیست. چیزی حدود یک ثانیه وقفه میفته بین پخش دو فایل. دلیل چی میتونه باشه؟

PC2st
چهارشنبه 31 مرداد 1386, 17:31 عصر
دوست عزیز؛ بحث رو خیلی کلی نگاه کرده بودم و به جواب سوال شما خیلی کلی جواب داده بودم، بعبارت دیگه Thread لازم نیست و همون متد PlaySync کفایت میکنه، یعنی مثلا:


SoundPlayer Player;
Player = new SoundPlayer();
Player.SoundLocation = "start.wav";
Player.PlaySync();
Player.PlaySync();
Player.PlaySync();
Player.PlaySync();



با اینکه ابتدا و انتهای فایل های صوتی ، فضای خالی نیست (کل تایم فایل پره) ، ولی فاصله بین پخش دو Thread چندان جالب نیست. چیزی حدود یک ثانیه وقفه میفته بین پخش دو فایل. دلیل چی میتونه باشه؟
از همین Thread ها امتحان کردم، فاصله ای نمیافته، مگر اینکه کار بخصوصی کرده باشید.

foroughiiii
یک شنبه 28 شهریور 1389, 13:42 عصر
با سلام وخسته نباشيد

خواهش ميكنم به اين سوال من جواب بديد


من تازه برنامه نويسي با #cشروع كردم
ولي ميخواستم يه پروژه اي ايجاد كنم كه مثل يه پيانوي ساده عمل كنه
يعي با زدن مثلا هر دكمه از 7 دكمه ي اين پيانوي ساده ،نت هاي مربوط به هر كدوم نواخته بشن
ميشه منو راهنمايي كنيد كه اول اينكه چه طور بايد اون صداهاي مربوط به هر نت مربوط به هر كليد رو ايجاد كنم؟و بعد چه طور اجرا شون كنم
من تو اينترنت دنبال پيدا كردن جوابم گشتم.ولي با كدهايي خيلي زياد در حد 2000 خط مواجه شدم كه تقريبا نميدونم چي كار ميكنن
ميشه منو راهنمايي كنيد براي توليد اين صدا ها يا به عبارتي نواختن نت ها........
.باتشكر فراوان تر از حد معمول