PDA

View Full Version : مشکلی در نوع Stream برای Resource



HosseinProgrammer
سه شنبه 20 شهریور 1386, 15:06 عصر
سلام.
به کد زیر دقت کنید:


System.IO.Stream[] Array = new System.IO.Stream[5];
Array[0] = AudioPlayer.Properties.Resources._10;
Array[1] = AudioPlayer.Properties.Resources._4;
Array[2] = AudioPlayer.Properties.Resources._7;
Array[3] = AudioPlayer.Properties.Resources._8;
Array[4] = AudioPlayer.Properties.Resources._9;

System.Media.SoundPlayer Player1 = new System.Media.SoundPlayer();

for (int i = 0; i < 2; i++)
{
Player1.Stream = Array[1];
MessageBox.Show("1");
Player1.PlaySync();
Player1.Stream = Array[4];
Player1.PlaySync();
MessageBox.Show("2");
}


در دور دوم حلقه برنامه با چنین خطایی روبرو میشه: The wave header is corrupt.

وقتی بررسی کردم دیدم که در شرایط زیر این خطا اتفاق میوفته:

فایل های صوتی در Resource در یک آرایه ذخیره بشن و اگر از یک خانه ی آرایه بیش از یکبار استفاده بشه، چنین مشکلی اتفاق میوفته. منظورم از بیش از یکبار، اینه که حتما بعد از
Player1.Stream = Array[1] ، آدرس Player1.Stream تغییر کنه. یعنی اگه
Player1.Stream = Array[4] در حلقه نباشه، مشکلی پیش نمیاد.
به عبارتی حتما حداقل یکبار آدرس تغییر کنه وبعدش آدرس تکراری داده بشه.
کد زیر هم مشکلی نداره: (وقتی که از آرایه استفاده نشه)


for (int i = 0; i < 2; i++)
{
Player1.Stream = AudioPlayer.Properties.Resources._10;
MessageBox.Show("1");
Player1.PlaySync();
Player1.Stream = AudioPlayer.Properties.Resources._9;
Player1.PlaySync();
MessageBox.Show("2");
}


دوستان ممنون میشم اگه جواب بدید. اگه جایی ابهامی وجود داره، بفرمایید تا بیشتر توضیح بدم. ضمنا اگه در مورد نوع Stream هم یه کم توضیح بدید ممنون میشم. توی سایت جستجو کردم چیزی دستگیرم نشد.

HosseinProgrammer
سه شنبه 20 شهریور 1386, 17:09 عصر
کسی نیست جواب سوالمو بده؟! من تا آخر امشب بیشتر وقت ندارم!!! :افسرده:

__H2__
چهارشنبه 21 شهریور 1386, 11:26 صبح
سلام
عزیز جان Stream یک جریان داده است، آن دستور به قول شما بدون آرایه این جریان را از نو میسازد ولی آرایه فقط نگه میدارد
چه فرقی دارد؟
Stream مثل یک نوارنقاله است که داده ها از رویش رد میشوند، یا مثل یک رشته دراز ماکارونی یا زنجیر!!! وقتی به انتها برسد تمام میشود!
در نتیجه از یک Stream فقط یک بار میتوان اطلاعات را خواند و یک بار صوت مورد نظر را پخش کرد!
ولی دستور دوم شما برای آن کار میکند که خودش یک Stream جدید میسازد.


اصلاً نگه داری Stream ها در آرایه کار معمولی نیست، مثلاً در همین مورد شما، بهتر است اشیای Player پر شده با Stream را در آرایه نگه داری کنید. (اگر اصلاً نیازی باشد.)