كيف التعامل مع الصوت من داخل التطبيق
#1
السلام عليكم
قمت بعمل برنامج لصفحة من القرآن الكريم بدمج الملف الصوتي داخل الملف التنفيذي
الحمد لله تم العمل باستخدام ملف من نوع mp3 بمكونات NewAC و تم عمل ازرار تشغيل و انتظار و استئناف و ايقاف و كان البرنامج يعمل بشكل جيد
لكن بعد تشغيل الملف عدة مرات او بشكل مستمر لمدة ساعة او اكثر بوجود الامر loop بدأ البرنامج يصدر خرخشة بسيطة بين الايات ثم زادت الخرخشة حتى أصبح البرنامج لا يصدر صوتا نقيا
بعد عمل اعادة تشغيل للجهاز كاملا و محاولة تشغيل البرنامج ظل الامر على ما هو عليه
احاول الان الاعتماد على ملفات wav بدلا من mp3
استخدمت تقنية ادراج الملف الصوتي داخل الريسورس و الملف يعمل باستخدام زر بداية
السؤال : كيف التعامل مع الصوت ؟ الايقاف المؤقت و الايقاف و الاستئناف
الكود المستعمل :
PHP كود :
unit Unit1;

interface

uses
  MMSystem
, Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  
Dialogs, StdCtrls, jpeg, ExtCtrls;

type
  TForm1 
= class(TForm)
    
Button1: TButton;
    
Image1: TImage;
    
procedure Button1Click(Sender: TObject);
  private
    { Private 
declarations }
  public
    { Public 
declarations }
  
end;

var
  
Form1: TForm1;

implementation

{$R *.dfm}
{
$R quran.Res}

 
procedure TForm1.Button1Click(Sender: TObject) ;
 var
   
hFind, hRes: THandle;
   
Song: PChar;
 
begin
  hFind 
:= FindResource(HInstance, 'page1', 'WAVE') ;
  if 
hFind <> 0 then begin
    hRes
:=LoadResource(HInstance, hFind) ;
    if 
hRes <> 0 then begin
      Song
:=LockResource(hRes) ;
      if 
Assigned(Song) then SndPlaySound(Song, snd_ASync or snd_Memory) ;
      
UnlockResource(hRes) ;
    
end;
    
FreeResource(hFind) ;
  
end;
 
end;

end. 

هنا نص الكود القديم الذي استعملته لملفات mp3
فماذا عن استخدام ملفات wav ?
PHP كود :
unit page1;

interface

uses
  Windows
, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  
Dialogs, jpeg, ExtCtrls, StdCtrls, ACS_Classes, ACS_WinMedia, ACS_smpeg,
  
ACS_DXAudio;

type
  TForm1 
= class(TForm)
    
Image1: TImage;
    
Button1: TButton;
    
DXAudioOut1: TDXAudioOut;
    
MP3In1: TMP3In;
    
Label1: TLabel;
    
Label2: TLabel;
    
Label3: TLabel;
    
Label4: TLabel;
    
Label5: TLabel;
    
Button2: TButton;
    
Button3: TButton;
    
procedure FormCreate(Sender: TObject);
    
procedure Button1Click(Sender: TObject);
    
procedure Button2Click(Sender: TObject);
    
procedure Button3Click(Sender: TObject);
    
procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private 
declarations }
  public
    { Public 
declarations }
  
end;

var
  
Form1: TForm1;
   
rStream: TResourceStream;
  
mStream: TMemoryStream;
implementation

 
{$R *.DFM} {$R quran.res}
procedure TForm1.Button1Click(Sender: TObject);
begin
  DXAudioOut1
.Run;
  
Button1.Enabled:=False;
  
Button2.Enabled:=true;
  
Button3.Enabled:=true;

end;
 
procedure TForm1.Button2Click(Sender: TObject);
begin
 Button2
.Enabled:=False;
  if 
DXAudioOut1.Status = tosPlaying then
  begin
    DXAudioOut1
.Pause;
    
Button2.Caption := 'استئناف';
    
Button2.Enabled:=true;
    
Button1.Enabled:=False;
    
Button3.Enabled:=False;
  
end else
    if 
DXAudioOut1.Status = tosPaused then
    begin
    DXAudioOut1
.Resume;
    
Button2.Caption := 'انتظار';
    
Button2.Enabled:=true;
    
Button1.Enabled:=False;
    
Button3.Enabled:=true;
  
end
end
;
 
procedure TForm1.Button3Click(Sender: TObject);
begin
Button3
.Enabled:=false;
  if 
DXAudioOut1.Status = tosPlaying then
  begin
    Button3
.Enabled:=true;
    
DXAudioOut1.Stop;
    
Button1.Enabled:=true;
    
Button2.Enabled:=false;
    
Button3.Enabled:=false;
    
end else
      if 
DXAudioOut1.Status = tosPaused then
    begin
  DXAudioOut1
.Stop;
  
Button3.Enabled:=false;
  
Button1.Enabled:=true;
  
Button2.Enabled:=false;

      
end

end
;
  
procedure TForm1.FormCreate(Sender: TObject);
begin
  rStream 
:= TResourceStream.Create(hInstance, 'quran', RT_RCDATA) ;
  
mStream := TMemoryStream.Create;
  
mStream.CopyFrom(rStream, 0);
  
MP3In1.Stream:=mStream;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  DXAudioOut1
.Stop(False);
  
mStream.Free;
  
rStream.Free;
end;

end. 
الرد
#2

وعليكم السلام ورحمة الله

راجع الأمثلة التي ضمن المكون هناك مثالين
Mp3player
WvPlayer
بالتوفيق
الرد
#3
أخي ابو عبد العزيز
جزاك الله كل خير أولا
ثانيا : في ظني أن المكون كما أخبرتني من قبل هو سبب الخرخشة و ليست ملفات mp3
ذلك أن الملفات حجمها كبير و يبدو ان المكون لا يتحمل طولها
و عليه فانا الان أحاول استخدام تشغيل الصوت من داخل البيئة الاصلية للدلفي بدون مكونات اضافية
كما هو الكود الاول و هو يعمل بشكل جيد و بدون خرخشة لكن تنقصني ازرار فقط
توصلت بعد البحث الى امكانية ايقاف الصوت باستخدام الكود التالي في زر الايقاف
إقتباس : procedure TForm1.Button2Click(Sender: TObject);
begin
sndPlaySound(nil, 0); // Stops the sound
Button1.Enabled:=true;
Button3.Enabled:=true;
Button2.Enabled:=False;
end;
لكن يبقى كود التوقف المؤقت و الاستئناف
و هانحن نبحث و نجتهد و شكرا لكم
الرد
#4

جرب اصدار اقدم من مكون NewAC تجد المشكل اختفى
كود :
http://symmetrica.net/newac/newac250.zip
إقتباس : التوقف المؤقت و الاستئناف
كود :
DXAudioOut1.Pause;
و
كود :
DXAudioOut1.Resume;
الرد
#5
أخي عبد العزيز يبدو انك لم تنتبه لم اسال عن الانتظار المؤقت و الاستئناف لمشغلات مكونات NewAC فقد عرفتها
و قمت بكتابتها في البرنامج من خلال البحث و هي تعمل بكفاءة
كان السؤال مددا منذ البداية و هو كود التوقف و المؤقت و الاستئناف الخاص بدالة sndPlaySound
التي من خلالها اقوم بتشغيل ملف wav من داخل الريسورس
و قد توصلت بعد بحث الى كود التوقف و هو السابق وضعه بطريقة
sndPlaySound(nil, 0);
الرد


التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم