PDA

View Full Version : پخش آلارم صوتی



hamedjafari
یک شنبه 22 شهریور 1388, 09:31 صبح
با یک سوال دیگه اومدم.
تو یه برنامه نیاز دارم در صورت وقوع یه سری کارا ، آلارم های صوتی پخش بشه . البته یه منو هم می خوام بذارم که کاربر بتونه این آلارم صوتی رو خودش انتخاب کنه . مهم نیست با چه پسوندی باشه ولی احتمالا باید با wav کار کنم دیگه .
حالا سوالم اینه که برای پخش یک فایل صوتی چه کاری باید انجام بشه؟ چه ابزاری و چه دستوراتی؟
ممنون

جواد ملاولی
یک شنبه 22 شهریور 1388, 10:54 صبح
سلام. میتونی از MediaPlayer دلفی استفاده کنی.

with MediaPlayer1 do
begin
FileName := 'آدرس فایل شما';
Open;
Play;
end;

khoshblagh
چهارشنبه 25 شهریور 1388, 09:07 صبح
سلام. میتونی از MediaPlayer دلفی استفاده کنی.

with MediaPlayer1 do
begin
FileName := 'آدرس فایل شما';
Open;
Play;
end;
با تشکر از آقای ملاوی . مشکلی که این کد دارد این است که فرضا اگر برای خروج از برنامه استفاده شود باید بعد از اون از کدی استفاده کرد که باعث تاخیر شود (مثلا استفاده از showmessage) . در غیر اینصورت آن فایل صوتی بسیار کوتاه و غیر واقعی پخش میشود.
متشکرم

جواد ملاولی
چهارشنبه 25 شهریور 1388, 11:29 صبح
با تشکر از آقای ملاوی . مشکلی که این کد دارد این است که فرضا اگر برای خروج از برنامه استفاده شود باید بعد از اون از کدی استفاده کرد که باعث تاخیر شود (مثلا استفاده از showmessage) . در غیر اینصورت آن فایل صوتی بسیار کوتاه و غیر واقعی پخش میشود.
متشکرم
بله درسته. البته جناب جعفری نفرموده بودن که برای خروج از برنامه می خوان.

Saeed_m_Farid
چهارشنبه 25 شهریور 1388, 15:23 عصر
سلام
می تونید از توابع PlaySound یا sndPlaySound موجود در یونیت MMSystem استفاده کنید، زیاد هم سخت نیست، من یه نمونه واستون گذاشتم تو ضمیمه.
البته توجه کنید که این توابع فقط برای فایلهای Wave ساده (RIFF (http://en.wikipedia.org/wiki/Resource_Interchange_File_Format)) جوابگو هستن و برای فایلهای کدک دار (مثل mp3) نمیتونید از این توابع استفاده کنید.
برای اطلاعات بیشتر در مورد فایلهای صوتی، میتونید به اینجا (http://www.barnamenevis.org/forum/showthread.php?t=167042)مراجعه کنید.

Saeed_m_Farid
چهارشنبه 25 شهریور 1388, 15:29 عصر
اینم قسمت اصلی کد برای کسانی که نمی خوان ضمیمه رو دانلود کنند :


(************************************************* ***********)
Procedure LoadFile(WaveFileName: String);
var
wFl: File of AnsiChar;
idx: Integer;
begin
AssignFile(wFl, WaveFileName);
Reset(wFl);
GetMem(buffer, Filesize(wFl) + 58+1);
FileTime:=(Trunc((Filesize(wFl) + 58+1)/8000)+1);
try
idx:= 0;
Seek(wFl, 0);
while not eof(wFl) do begin
read(wFl, Char(buffer[idx]));
inc(idx);
end;
CloseFile(wFl);
except
Exit;
end;
end;
(************************************************* ***********)
procedure TfrmMain.btnPlayClick(Sender: TObject);
begin
if FileExists(edtFilePath.Text) then begin
LoadFile(edtFilePath.Text);
if(PlaySound(buffer, 0,SND_MEMORY or SND_ASYNC) <> TRUE)then
ShowMessage('error');
lblTime.Caption := IntToStr(FileTime) + ' Sec(s).';
end;
end;
(************************************************* ***********)
procedure TfrmMain.btnStopClick(Sender: TObject);
begin
// sndPlaySound(nil, SND_ASYNC);
sndPlaySound(nil, SND_PURGE);
if (buffer<>nil) then
freemem(buffer);
end;
(************************************************* ***********)

موفق باشید.

tdkhakpur
پنج شنبه 26 شهریور 1388, 00:18 صبح
سلام
کدهای بالا یک کار تنظیم شده پخش و قطع صدا را انجام میدهد ولی اگر میخواهید منتظر تمام شدن صدا باشید به صورت زیر کد پخش را اصلاح کنید این کار برای خروج از برنامه لازم میشود

(************************************************* ***********)
procedure TfrmMain.btnPlayClick(Sender: TObject);
begin
if FileExists(edtFilePath.Text) then begin
LoadFile(edtFilePath.Text);
//if(PlaySound(buffer, 0,SND_MEMORY or SND_ASYNC) <> TRUE)then
//اصلاح شود به
if(PlaySound(buffer, 0,SND_MEMORY ) <> TRUE)then
ShowMessage('error');
lblTime.Caption := IntToStr(FileTime) + ' Sec(s).';
end;
end;
(************************************************* ***********)

Saeed_m_Farid
پنج شنبه 26 شهریور 1388, 11:15 صبح
سلام
کدهای بالا یک کار تنظیم شده پخش و قطع صدا را انجام میدهد ولی اگر میخواهید منتظر تمام شدن صدا باشید به صورت زیر کد پخش را اصلاح کنید این کار برای خروج از برنامه لازم میشود
دوست عزیز
اگه بخواهیم "منتظر تمام شدن صدا باشیم" باید از Thread استفاده کنیم، همینطوری فرم قفل میکنه؛ من برای سادگی کار از thread استفاده نکردم و با حذف SND_ASYNC فرم برنامه فریز میشه، یعنی عملاً کل کارها منوط میشه به پایان صوت مربوطه!
حتی اگه نخواهیم از thread استفاده کنیم، باید حداقل یه Application.ProcessMessages بذاریم و فعال بودن دکمه ها رو مدیریت کنیم و ... ولی این کارها لازم نیست!
چه لزومی داره که صوت SYNC پخش بشه؟ پخش صوت از طریق API های winmm.dll انجام می گیره و ربطی به خروج از برنامه نداره ...

tdkhakpur
پنج شنبه 26 شهریور 1388, 16:42 عصر
دوست عزیز
اگه بخواهیم "منتظر تمام شدن صدا باشیم" باید از Thread استفاده کنیم، همینطوری فرم قفل میکنه؛ من برای سادگی کار از thread استفاده نکردم و با حذف SND_ASYNC فرم برنامه فریز میشه، یعنی عملاً کل کارها منوط میشه به پایان صوت مربوطه!
حتی اگه نخواهیم از thread استفاده کنیم، باید حداقل یه Application.ProcessMessages بذاریم و فعال بودن دکمه ها رو مدیریت کنیم و ... ولی این کارها لازم نیست!
چه لزومی داره که صوت SYNC پخش بشه؟ پخش صوت از طریق API های winmm.dll انجام می گیره و ربطی به خروج از برنامه نداره ...
نه همچین چیزی هم نیست...
من اون پاسخ را من به شما عرض نکردم به کسی که منظورش این موضوع هست شرح دادم.
ولی در مورد اینکه به چه دردی میخوره باید عرض کنم به درد کسی میخوره که برنامه اش به اون لازم داشته باشد حتما تا حالا همچین کاری انجام ندادید ولی بعدا متوجه خواهید شد.
ضمنا برای همه چیز نمیشه دست به دامن Thread شد که؟:لبخندساده:

Saeed_m_Farid
شنبه 28 شهریور 1388, 14:51 عصر
دوست عزیز
لطفاً موقع گذاشتن پست، پاسختون رو علمی/فنی ارائه کنید، این نوع پاسخ های بی محتوا و جنجال برانگیز موجب بیراهه رفتن تاپبک ها میشه.
قصد داشتم پاسخ ندم، ولی ترسیدم موجب گمراهی دوستان بشه :

نه همچین چیزی هم نیست...
کدوم طور چیزی هم نیست؟ یعنی با پخش سنکرون صوت تو برنامه، فرم فریز نمیشه؟ اگه منظورتون اینه که در اشتباهید و دوستان دیگه رو هم دارید گمراه می کنید ...

من اون پاسخ را من به شما عرض نکردم به کسی که منظورش این موضوع هست شرح دادم.
به هرکسی عرض کردید، شما کد بنده رو تغییر دادید و همین باعث میشه من بدون توجه به اینکه شما طرف صحبتت کیه، از مشکلی که در اون حالت ایجاد میشه، جلوگیری کنم! اگه راه حل بهتری سراغ دارید بفرمایید، نه اینکه کد دیگران رو دستکاری کنید و بگید که به خودم مربوطه!!!

ولی در مورد اینکه به چه دردی میخوره باید عرض کنم به درد کسی میخوره که برنامه اش به اون لازم داشته باشد حتما تا حالا همچین کاری انجام ندادید ولی بعدا متوجه خواهید شد.
اولاً کسی نپرسید که "به چه دردی میخوره" (چون همچین چیز پیچیده ای نیست) که شما بخواهید جواب بدید، و در ثانی به فرض که شما بخواهید جواب این سوال فرضی رو بدین؛ این یعنی چی : "برنامه اش به اون لازم داشته باشد" !!! این جمله چه بار فنی ای داره؟
من که منظورتون رو متوجه نشدم، ولی حتی اگه "برنامه ام به اون لازم داشته باشه!" نیاز به جلوگیری از بروز مشکلات همزمانی هست، یعنی اگه قرار باشه چند تا Wave Frame همزمان پخش بشه، یا یه رشته طولانی صوتی توسط winmm.dll پخش بشه، همه چیز متوقف میشه تا پخش صوت موردنظر تموم بشه! ضمناً لازم نیست شما نگران متوجه شدن یا نشدن بنده باشید، اگه احساس می کنید موردی تو کارم دارم، از لحاظ فنی بفرمایید و از رجز خوندن دست بکشید ...
معنی اینکه من گفتم "چه لزومی داره" <> "لطفاً بفرمایید به چه دردی میخورد"!
این جمله معنیش این هست که انجام این کار در اینجا از دید بنده بی معنی بوده است ...

ضمنا برای همه چیز نمیشه دست به دامن Thread شد که؟:لبخندساده:
برای همه چیز نه، ولی در مواقعی که لازم هست برنامه نویس نباید از سرش باز کنه و دنبال راه دررو باشه، این باعث بدآموزی برای تازه کارهایی "مثل بنده" میشه ...

پ.ن: باور کنید من هیچ مشکل شخصی با شما ندارم، نمیدونم چرا این طور برخورد می کنید؟ شاید دیگران ندونند ولی ضمن پیام خصوصی خواهش کردم از این نوع برخورد دست بردارید، چون اصل موضوع لوث میشه و موجب بی احترامی های ناخواسته از هر دو طرف میشه، چرا رو هر پست بنده دارید با این لحن غیرعلمی پست می زنید؟

tdkhakpur
شنبه 28 شهریور 1388, 20:38 عصر
آقا saeed توجه بفرما فکر میکنی کجا هستی داری با خودت حرف میزنی دوستمان خواسته اش مطالب زیر بود من کد شما را اصلاح کردم.تو هم مثل اینکه خیلی دوست داری انگلیسی را با فارسی قاطی کنی و نشان بدی که خیلی بارته. به این شکلها هم نیست یه کمی هم به فکر نوشتن برنامه هایی باش که خودت نوشتیش نه برنامه های پخته شده. این حرف را به این خاطر عرض میکنم که شما همیشه با کدهای که ارسال میکنید مشکل دارید یعنی به نوعی کدهای شما ناقصه و شاید هم ازشون اطلاع ندارید بعدا مکمنه عالم بی عمل بشی ها..
این حرف را هم به شما عرض کنم این من نیستم که جنجال میکنم این شمایید که دوست دارید کسی از شما ایراد نگیرد خواهشا از این کارهای کوچیک دیگر انجام نده وقتمان را هم نگیر حالا هم اگر جواب شما ندیم برای خودت یک فکرهای خوب خوب میکنی دستت درد نکند نمی خواد پاسخ بدی....
.

با تشکر از آقای ملاوی . مشکلی که این کد دارد این است که فرضا اگر برای خروج از برنامه استفاده شود باید بعد از اون از کدی استفاده کرد که باعث تاخیر شود (مثلا استفاده از showmessage) . در غیر اینصورت آن فایل صوتی بسیار کوتاه و غیر واقعی پخش میشود.
متشکرم