⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mmeq.pas

📁 一套及时通讯的原码
💻 PAS
📖 第 1 页 / 共 3 页
字号:
         for i := 0 to TMMEQFilterList(Source).Count-1 do
         begin
            Filter := TMMEQFilter.Create;
            Filter.Assign(TMMEQFilterList(Source)[i]);
            AddObject(Filter);
         end;

      finally
         if (FEqualizer <> nil) then
             FEqualizer.FUpdating := False;

         EndUpdate;
      end;
   end
   else inherited assign(Source);
end;

{-- TMMEQFilterList -----------------------------------------------------------}
procedure TMMEQFilterList.DefineProperties(Filer: TFiler);
begin
   Filer.DefineBinaryProperty('ObjectContainer', ReadData, WriteData, True);
end;

{-- TMMEQFilterList -----------------------------------------------------------}
procedure TMMEQFilterList.ReadData(S: TStream);
Var
   pBuf: PChar;
   Kennung: Longint;
   ObjCount,
   Index: TOLSize;
   Destroy: Boolean;
   Value: Longint;

begin
   BeginUpdate;
   try
      FEqualizer.FUpdating := True;
      S.ReadBuffer(Kennung,sizeOf(STREAMKENNUNG));
      if (Kennung <> STREAMKENNUNG) then
         raise EStreamError.Create('Invalid Object stream');
      FreeAll;
      { load stream items }
      S.ReadBuffer(Destroy,SizeOf(Destroy));
      DestroyObjects := Destroy;

      { read string length }
      S.ReadBuffer(Value,SizeOf(Value));
      if Value > 0 then
      begin
         pBuf := StrAlloc(Value+1);
         try
            FillChar(pBuf^, Value+1, 0);
            S.ReadBuffer(pBuf^, Value);
            FEqualizer.Description := StrPas(pBuf);
         finally
            StrDispose(pBuf);
         end;
      end;

      S.ReadBuffer(Value,SizeOf(Value));
      FEqualizer.FFTLength := Value;

      S.ReadBuffer(ObjCount,SizeOf(Objcount));  { Read in Object count }
      if Capacity-Count < ObjCount then Capacity := Count+ObjCount;

      { Read in Object Count }
      for Index := 0 to ObjCount-1 do
          AddObject(ReadObjectFromStream(S));

   finally
      FEqualizer.FUpdating := False;
      EndUpdate;
   end;
end;

{-- TMMEQFilterList -----------------------------------------------------------}
procedure TMMEQFilterList.WriteData(S: TStream);
var
   Index,ObjCount: TOlSize;
   Destroy: Boolean;
   Value: Longint;

begin
   { Write list to Stream }
   S.WriteBuffer(STREAMKENNUNG,SizeOf(STREAMKENNUNG));
   Destroy := DestroyObjects;
   S.WriteBuffer(Destroy,SizeOf(Destroy));

   { write string length }
   Value := Length(FEqualizer.FDescription);
   S.WriteBuffer(Value, SizeOf(Value));
{$IFDEF WIN32}
   S.WriteBuffer(PChar(FEqualizer.FDescription)^, Length(FEqualizer.FDescription));
{$ELSE}
   S.WriteBuffer(FEqualizer.FDescription[1], Length(FEqaulizer.FDescription));
{$ENDIF}

   Value := FEqualizer.FFTLen;
   S.WriteBuffer(Value, SizeOf(Value));

   ObjCount := Count;
   S.WriteBuffer(ObjCount,SizeOf(ObjCount));
   for Index := 0 to Count-1 do
       WriteObjectToStream(Items[Index],S);
end;

{== TMMEqualizer ==============================================================}
constructor TMMEqualizer.Create(aOwner: TComponent);
begin
   inherited Create(aOwner);

   FFilters := TMMEQFilterList.Create;
   FFilters.OnChange := FiltersChanged;
   FFilters.FEqualizer := Self;

   FPFilter    := nil;
   FPTempFilter:= nil;
   FDescription:= 'Untitled';
   Ffs         := defRate;
   FWindow     := defWindow;
   FChannel    := defChannel;
   FEnabled    := defEnabled;
   FOpen       := False;
   FUpdating   := False;
   FSpectrum   := nil;
   FFTLen      := 8;
   FFTLength   := defFFTLen;

   ErrorCode := ComponentRegistered(InitCode, Self, ClassName);
   if (ErrorCode <> 0) then RegisterFailed(InitCode, Self , ClassName);
end;

{-- TMMEqualizer --------------------------------------------------------------}
destructor TMMEqualizer.Destroy;
begin
   Close;

   SetSpectrum(nil);

   FFilters.Free;

   inherited Destroy;
end;

{-- TMMEqualizer --------------------------------------------------------------}
procedure TMMEqualizer.Notification(aComponent: TComponent; Operation: TOperation);
begin
   inherited Notification(aComponent, Operation);

   if (Operation = opRemove) then
   begin
      if (aComponent = FSpectrum) then
          FSpectrum := nil;
   end;
end;

{-- TMMEqualizer --------------------------------------------------------------}
procedure TMMEqualizer.PcmOverflow;
begin
   if assigned(FOnPcmOverflow) then FOnPcmOverflow(Self);
end;

{-- TMMEqualizer --------------------------------------------------------------}
procedure TMMEqualizer.SetPWaveFormat(aValue: PWaveFormatEx);
begin
   if (aValue <> nil) then
   begin
      if not (csDesigning in ComponentState) then
         if not pcmIsValidFormat(aValue) or (aValue^.wBitsPerSample = 8) then
            raise EMMEqualizerError.Create(LoadResStr(IDS_INVALIDFORMAT));

      SampleRate := aValue^.nSamplesPerSec;
   end;

   inherited SetPWaveFormat(aValue);
end;

{-- TMMEqualizer --------------------------------------------------------------}
procedure TMMEqualizer.SaveToRegIniFile(Ini: TRegIniFile; Section: string);
var
   i: integer;
begin
   if (Ini <> nil) then
   begin
      with Ini do
      begin
         WriteInteger(Section, 'FFTLen', FFTLength);
         WriteInteger(Section, 'Samplerate', Samplerate);
         WriteInteger(Section, 'Window', Ord(Window));

         WriteInteger(Section, 'Bands', Filters.Count);
         for i := 0 to Filters.Count-1 do
         with Filters[i] do
         begin
            WriteString(Section, 'Band'+IntToStr(i)+' f1', FloatToStr(f1));
            WriteString(Section, 'Band'+IntToStr(i)+' f2', FloatToStr(f2));
            WriteString(Section, 'Band'+IntToStr(i)+' Gain', FloatToStr(Gain));
            WriteBool(Section, 'Band'+IntToStr(i)+' Enabled', Enabled);
         end;
      end;
   end;
end;

{-- TMMEqualizer --------------------------------------------------------------}
procedure TMMEqualizer.SaveToIniFileEx(Ini: TIniFile; Section: string);
var
   i: integer;
begin
   if (Ini <> nil) then
   begin
      with Ini do
      begin
         WriteInteger(Section, 'FFTLen', FFTLength);
         WriteInteger(Section, 'Samplerate', Samplerate);
         WriteInteger(Section, 'Window', Ord(Window));

         WriteInteger(Section, 'Bands', Filters.Count);
         for i := 0 to Filters.Count-1 do
         with Filters[i] do
         begin
            WriteString(Section, 'Band'+IntToStr(i)+' f1', FloatToStr(f1));
            WriteString(Section, 'Band'+IntToStr(i)+' f2', FloatToStr(f2));
            WriteString(Section, 'Band'+IntToStr(i)+' Gain', FloatToStr(Gain));
            WriteBool(Section, 'Band'+IntToStr(i)+' Enabled', Enabled);
         end;
      end;
   end;
end;

{-- TMMEqualizer --------------------------------------------------------------}
procedure TMMEqualizer.ReadFromRegIniFile(Ini: TRegIniFile; Section: string);
var
   Cnt, i: integer;
   f1,f2,Gain: Float;
   Enabl: Boolean;

begin
   if (Ini <> nil) then
   begin
      with Ini do
      begin
         i := ReadInteger(Section, 'FFTLen', -1);
         if (i > 0) then
         begin
            Filters.BeginUpdate;
            try
               FUpdating := True;

               Filters.FreeAll;

               FFTLength   := ReadInteger(Section, 'FFTLen', defFFTLen);
               Samplerate  := ReadInteger(Section, 'Samplerate', defRate);
               Window      := TMMFFTWindow(ReadInteger(Section, 'Window', Ord(defWindow)));
               Description := Section;

               Cnt := ReadInteger(Section, 'Bands', 0);

               for i := 0 to Cnt-1 do
               begin
                  f1   := StrToFloat(CheckFloat(ReadString(Section, 'Band'+IntToStr(i)+' f1', '0')));
                  f2   := StrToFloat(CheckFloat(ReadString(Section, 'Band'+IntToStr(i)+' f2', '0')));
                  Gain := StrToFloat(CheckFloat(ReadString(Section, 'Band'+IntToStr(i)+' Gain', '0')));
                  Enabl:= ReadBool(Section, 'Band'+IntToStr(i)+' Enabled', True);

                  Filters.AddObject(TMMEQFilter.CreateEx(f1,f2,Gain));
                  Filters[i].Enabled := Enabl;
               end;

            finally
               FUpdating := False;
               Filters.EndUpdate;
            end;
         end;
      end;
   end;
end;

{-- TMMEqualizer --------------------------------------------------------------}
procedure TMMEqualizer.ReadFromIniFileEx(Ini: TIniFile; Section: string);
var
   Cnt, i: integer;
   f1,f2,Gain: Float;
   Enabl: Boolean;

begin
   if (Ini <> nil) then
   begin
      with Ini do
      begin
         i := ReadInteger(Section, 'FFTLen', -1);
         if (i > 0) then
         begin
            Filters.BeginUpdate;
            try
               FUpdating := True;

               Filters.FreeAll;

               FFTLength   := ReadInteger(Section, 'FFTLen', defFFTLen);
               Samplerate  := ReadInteger(Section, 'Samplerate', defRate);
               Window      := TMMFFTWindow(ReadInteger(Section, 'Window', Ord(defWindow)));
               Description := Section;

               Cnt := ReadInteger(Section, 'Bands', 0);

               for i := 0 to Cnt-1 do
               begin
                  f1   := StrToFloat(CheckFloat(ReadString(Section, 'Band'+IntToStr(i)+' f1', '0')));
                  f2   := StrToFloat(CheckFloat(ReadString(Section, 'Band'+IntToStr(i)+' f2', '0')));
                  Gain := StrToFloat(CheckFloat(ReadString(Section, 'Band'+IntToStr(i)+' Gain', '0')));
                  Enabl:= ReadBool(Section, 'Band'+IntToStr(i)+' Enabled', True);

                  Filters.AddObject(TMMEQFilter.CreateEx(f1,f2,Gain));
                  Filters[i].Enabled := Enabl;
               end;

            finally
               FUpdating := False;
               Filters.EndUpdate;
            end;
         end;
      end;
   end;
end;

{-- TMMEqualizer --------------------------------------------------------------}
procedure TMMEqualizer.SaveToIniFile(IniFile: TFileName; Section: string);
var
   Ini: TIniFile;
begin
   if (IniFile <> '') then
   begin
      Ini := TIniFile.Create(IniFile);
      try
         Section := 'EQ.'+Section;
         SaveToIniFileEx(Ini, Section);
      finally
         Ini.Free;
      end;
   end;
end;

{-- TMMEqualizer --------------------------------------------------------------}
procedure TMMEqualizer.ReadFromIniFile(IniFile: TFileName; Section: string);
var
   Ini: TInifile;
begin
   if (IniFile <> '') then
   begin
      Ini := TIniFile.Create(IniFile);
      try
         Section := 'EQ.'+Section;
         ReadFromIniFileEx(Ini,Section);
      finally
         Ini.Free;
      end;
   end;
end;

{-- TMMEqualizer --------------------------------------------------------------}
procedure TMMEqualizer.SetFilters(aValue: TMMEQFilterList);
begin
   if (aValue <> FFilters) then FFilters.Assign(aValue);
end;

{-- TMMEqualizer --------------------------------------------------------------}
procedure TMMEqualizer.FilterChanged(Sender: TObject);
begin
   { setup one equalizer band with the params }
   if not FUpdating then

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -