263 lines
7.1 KiB
ObjectPascal
263 lines
7.1 KiB
ObjectPascal
(*
|
|
this file is a part of audio components suite v 2.4.
|
|
copyright (c) 2002-2005 andrei borovsky. all rights reserved.
|
|
see the license file for more details.
|
|
you can contact me at mail@z0m3ie.de
|
|
*)
|
|
|
|
{
|
|
$Log: acs_mixer.pas,v $
|
|
Revision 1.2 2005/12/30 12:54:42 z0m3ie
|
|
some error checks
|
|
|
|
Revision 1.1 2005/12/19 18:34:35 z0m3ie
|
|
*** empty log message ***
|
|
|
|
Revision 1.3 2005/12/04 16:54:34 z0m3ie
|
|
All classes are renamed, Style TACS... than T... to avoid conflicts with other components (eg TMixer is TACSMixer now)
|
|
|
|
Revision 1.2 2005/10/02 16:51:46 z0m3ie
|
|
*** empty log message ***
|
|
|
|
Revision 1.1 2005/09/12 22:04:52 z0m3ie
|
|
modified structure again, fileformats are now in an sperat folder.
|
|
all File In/Out classes are capsulated from TFileIn and TFileOut
|
|
|
|
Revision 1.11 2005/09/01 19:55:48 z0m3ie
|
|
again Delphi corrections
|
|
|
|
Revision 1.10 2005/08/31 20:30:39 z0m3ie
|
|
Mixer Channelname work now
|
|
minior corrections for Converters
|
|
|
|
Revision 1.9 2005/08/31 14:37:59 z0m3ie
|
|
*** empty log message ***
|
|
|
|
Revision 1.8 2005/08/31 14:33:16 z0m3ie
|
|
fixed delphi issue with TControlEntry
|
|
|
|
Revision 1.7 2005/08/30 22:10:55 z0m3ie
|
|
Mixer mostly completed
|
|
|
|
Revision 1.6 2005/08/29 21:46:43 z0m3ie
|
|
*** empty log message ***
|
|
|
|
Revision 1.5 2005/08/28 20:31:18 z0m3ie
|
|
linux restructuring for 2.4
|
|
|
|
Revision 1.4 2005/08/28 18:35:53 z0m3ie
|
|
created Delphi package for 2.4
|
|
more Mixer stuff
|
|
updated some things for Delphi
|
|
|
|
Revision 1.3 2005/08/26 17:12:56 z0m3ie
|
|
*** empty log message ***
|
|
|
|
Revision 1.2 2005/08/26 17:03:20 z0m3ie
|
|
begon to make acs resourcestring aware
|
|
more advanced tmixer for windows
|
|
restructured tmixer its better handleable now
|
|
|
|
Revision 1.1 2005/08/25 20:18:00 z0m3ie
|
|
Version 2.4 restructure
|
|
TCDPlayer removed (fits not in component structure)
|
|
TMP3ToWavConverter removed (fits not in component structure)
|
|
|
|
Revision 1.2 2005/08/22 20:17:01 z0m3ie
|
|
changed Headers to log
|
|
changed mail adress
|
|
|
|
}
|
|
|
|
|
|
unit acs_mixer;
|
|
|
|
{$ifdef fpc}
|
|
{$mode delphi}
|
|
{$endif}
|
|
|
|
interface
|
|
|
|
uses
|
|
Classes, SysUtils, ACS_Classes, ACS_Strings
|
|
{$IFDEF MSWINDOWS}
|
|
,MMSystem,Windows,Dialogs
|
|
,Math
|
|
{$ELSE}
|
|
,Soundcard, baseunix
|
|
{$ENDIF}
|
|
;
|
|
|
|
type
|
|
TACSMixerChannel = (mcUnknown,
|
|
mcVolume,
|
|
mcTreble,
|
|
mcBass,
|
|
mcSynth,
|
|
mcPCM,
|
|
mcSpeaker,
|
|
mcLine,
|
|
mcMic,
|
|
mcCD,
|
|
mcIMix,
|
|
mcAltPCM,
|
|
mcRecLev,
|
|
mcDigital,
|
|
mcMonitor,
|
|
mcHeadphone,
|
|
mcTelephone);
|
|
|
|
{$IFDEF MSWINDOWS}
|
|
const
|
|
FirstSource = MIXERLINE_COMPONENTTYPE_SRC_UNDEFINED - MIXERLINE_COMPONENTTYPE_SRC_FIRST ;
|
|
LastSource = MIXERLINE_COMPONENTTYPE_SRC_ANALOG - MIXERLINE_COMPONENTTYPE_SRC_FIRST ;
|
|
FirstDest = MIXERLINE_COMPONENTTYPE_DST_FIRST;
|
|
LastDest = MIXERLINE_COMPONENTTYPE_DST_LAST;
|
|
|
|
type
|
|
{$IFDEF LCL}
|
|
TMixerLine = MIXERLINE;
|
|
TMixerCaps = MIXERCAPS;
|
|
TMixerControl = MIXERCONTROL;
|
|
TMixerLineControls = MIXERLINECONTROLS;
|
|
TMixerControlDetails = MIXERCONTROLDETAILS;
|
|
{$ENDIF}
|
|
|
|
TDataArray = ARRAY[FirstSource .. LastSource] OF MIXERCONTROLDETAILS_UNSIGNED;
|
|
PDataArray = ^TDataArray;
|
|
PControlEntry = ^TControlEntry;
|
|
TControlEntry = RECORD
|
|
IsInited : Boolean;
|
|
CHandle : Thandle;
|
|
CDestination : INTEGER;
|
|
CID : INTEGER;
|
|
CName : String[MIXER_SHORT_NAME_CHARS];
|
|
CConnect : INTEGER;
|
|
CCControls : INTEGER;
|
|
CControlTyp : INTEGER;
|
|
CKanal : INTEGER;
|
|
CControl : INTEGER;
|
|
CComponentTyp : DWORD;
|
|
CMin, Cmax : INTEGER;
|
|
Cdetails : TDataArray;
|
|
CMultItems : INTEGER;
|
|
CcSteps : DWORD;
|
|
END;
|
|
{$ENDIF}
|
|
|
|
TACSMixerLevel = record
|
|
case Word of
|
|
1 :
|
|
(
|
|
Left, Right : Byte;
|
|
);
|
|
2 : (Main : Byte;);
|
|
end;
|
|
|
|
{ TACSMixer }
|
|
|
|
TACSMixer = class(TComponent)
|
|
private
|
|
FDevNum : Integer;
|
|
FChannels : array of TACSMixerChannel;
|
|
{$IFDEF LINUX}
|
|
_mix_fd : Integer;
|
|
FFileName : String;
|
|
{$ELSE}
|
|
FMixer : HMixer;
|
|
FMixerCaps : TMixerCaps;
|
|
FControls : array of TControlEntry;
|
|
FMuteControls : array of TControlEntry;
|
|
{$ENDIF}
|
|
FMixerName : String;
|
|
function GetRecSource : Integer;
|
|
function GetVolume(vChannel : integer) : TACSMixerLevel;
|
|
procedure SetVolume(vChannel : integer; vLevel : TACSMixerLevel);
|
|
procedure SetRecSource(vChannel : integer);
|
|
procedure SetDevNum(Num : Integer);
|
|
function GetChannel(Num : Integer) : TACSMixerChannel;
|
|
function GetDevCount : Integer;
|
|
function GetChannelCount : Integer;
|
|
function GetChannelName(vChannel : Integer) : string;
|
|
function GetMute(vChannel : integer) : Boolean;
|
|
procedure SetMute(vChannel : integer; Mute : Boolean);
|
|
public
|
|
constructor Create(AOwner: TComponent); override;
|
|
destructor Destroy; override;
|
|
function IsStereo(vChannel : Integer) : Boolean;
|
|
function IsRecordable(vChannel : Integer) : Boolean;
|
|
property Channel[vChannel : Integer] : TACSMixerChannel read GetChannel;
|
|
property Level[vChannel : Integer] : TACSMixerLevel read GetVolume write SetVolume;
|
|
property Mute[vChannels : Integer] : Boolean read GetMute write SetMute;
|
|
property ChannelName[vChannel : Integer] : string read GetChannelName;
|
|
property RecordSource : Integer read GetRecSource write SetRecSource;
|
|
property DevCount : Integer read GetDevCount;
|
|
property Channelcount : Integer read GetChannelCount;
|
|
published
|
|
property DevNum : Integer read FDevNum write SetDevNum stored True;
|
|
property MixerName : String read FMixerName;
|
|
end;
|
|
|
|
var
|
|
MixersCount : Byte;
|
|
|
|
function ChannelToStr(ch : TACSMixerChannel) : String;
|
|
|
|
implementation
|
|
|
|
{$I ACS_Mixer.inc}
|
|
|
|
function ChannelToStr(ch : TACSMixerChannel) : String;
|
|
begin
|
|
case ch of
|
|
mcVolume: Result := strMixerVolume;
|
|
mcTreble: Result := strMixerTreble;
|
|
mcBass: Result := strMixerBass;
|
|
mcSynth: Result := strMixerSynth;
|
|
mcPCM: Result := strMixerPCM;
|
|
mcSpeaker: Result := strMixerSpeaker;
|
|
mcLine: Result := strMixerLine;
|
|
mcMic: Result := strMixerMic;
|
|
mcCD: Result := strMixerCD;
|
|
mcIMix: Result := strMixerIMix;
|
|
mcAltPCM: Result := strMixerAlt;
|
|
mcRecLev: Result := strMixerRec;
|
|
mcUnknown: Result := strMixerUnknown;
|
|
else Result := IntToStr(Integer(ch));
|
|
end;
|
|
end;
|
|
|
|
constructor TACSMixer.Create;
|
|
begin
|
|
inherited Create(AOwner);
|
|
if MixersCount > 0 then
|
|
SetDevNum(0);
|
|
end;
|
|
|
|
function TACSMixer.GetChannel(Num: Integer): TACSMixerChannel;
|
|
begin
|
|
if (Num < 0) or (Num > (length(FChannels)-1)) then
|
|
exit;
|
|
Result := FChannels[Num];
|
|
end;
|
|
|
|
function TACSMixer.GetDevCount : Integer;
|
|
begin
|
|
Result := MixersCount;
|
|
end;
|
|
|
|
function TACSMixer.GetChannelCount : Integer;
|
|
begin
|
|
result := length(FChannels);
|
|
end;
|
|
|
|
function TACSMixer.GetChannelName(vChannel : Integer) : string;
|
|
begin
|
|
if (vChannel > -1) and (vChannel < ChannelCount) then
|
|
Result := ChannelToStr(FChannels[vChannel]);
|
|
end;
|
|
|
|
initialization
|
|
MixersCount := CountMixers;
|
|
end.
|