Autor Beitrag
galagher
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2562
Erhaltene Danke: 46

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Sa 13.08.05 08:44 
Hallo!
Ich weiss, man soll eigentlich nicht ganzen Source-Code posten, aber ich verstehe diesen Code nicht, um ihn selbst abzuändern.

Kann mir bitte jemand diesen Code so ändern, dass der Ton nur über die Soundkarte, nicht aber gleichzeitig auch über den System-Lautsprecher ausgegeben wird? :flehan:
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
 {Soundausgabe über den Synthesizer der Soundkarte -}
 {der Source-Code stammt von Alan Lloyd}
 with WaveFormatEx do
 begin
  wFormatTag := WAVE_FORMAT_PCM;
  nChannels := Mono;
  nSamplesPerSec := SampleRate;
  wBitsPerSample := $0008;
  nAvgBytesPerSec := nSamplesPerSec * nBlockAlign;
  nBlockAlign := (nChannels * wBitsPerSample) div 8;
  cbSize := 0;
 end;

 MS := TMemoryStream.Create;
 with MS do
 begin
  {Calculate length of sound data and of file data}
  DataCount := (Duration *  SampleRate) div 1000;  // sound data
  RiffCount := Length(WaveId)
               + Length(FmtId) + SizeOf(DWord)
               + SizeOf(TWaveFormatEx)
               + Length(DataId) + SizeOf(DWord)
               + DataCount; // file data
  {write out the wave header}
  Write(RiffId[1], 4);                        // 'RIFF'
  Write(RiffCount, SizeOf(DWord));            // file data size
  Write(WaveId[1], Length(WaveId));           // 'WAVE'
  Write(FmtId[1], Length(FmtId));             // 'fmt '
  TempInt := SizeOf(TWaveFormatEx);
  Write(TempInt, SizeOf(DWord));              // TWaveFormat data size
  Write(WaveFormatEx, SizeOf(TWaveFormatEx)); // WaveFormatEx record
  Write(DataId[1], Length(DataId));           // 'data'
  Write(DataCount, SizeOf(DWord));            // sound data size
  {calculate and write out the tone signal}   // now the data values
  w := 2 * Pi * Hz;  // omega
  for i := 0 to DataCount - 1 do
  begin
   // wt = w *i /SampleRate
   SoundValue := 127 + trunc(127 * sin(i * w / SampleRate));
   Write(SoundValue, SizeOf(Byte));
  end;
   // you could save the wave tone to file with :
   // MS.Seek(0, soFromBeginning);
   // MS.SaveToFile('C:\MyFile.wav');
   // then reload and play them without having to
   // construct them each time.
   {now play the sound}
   sndPlaySound(MS.Memory, SND_MEMORY or SND_SYNC);
   MS.Free;
 end;

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10184
Erhaltene Danke: 1259

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Sa 13.08.05 11:25 
Moin!

user profile icongalagher hat folgendes geschrieben:
dass der Ton nur über die Soundkarte, nicht aber gleichzeitig auch über den System-Lautsprecher ausgegeben wird?

Da die Soundausgabe hierdrüber passiert:
ausblenden Delphi-Quelltext
1:
sndPlaySound(MS.Memory, SND_MEMORY or SND_SYNC);					

kann ich mir nur vorstellen, dass es an deinem Board oder den Systemeinstellungen liegt, das wird im Code nicht vorgegeben.

cu
Narses
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2562
Erhaltene Danke: 46

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Sa 13.08.05 20:04 
user profile iconNarses hat folgendes geschrieben:
kann ich mir nur vorstellen, dass es an deinem Board oder den Systemeinstellungen liegt

Kann es daran liegen, dass die Soundkarte OnBoard ist?

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10184
Erhaltene Danke: 1259

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Sa 13.08.05 21:49 
Moin!

user profile icongalagher hat folgendes geschrieben:
Kann es daran liegen, dass die Soundkarte OnBoard ist?

Möglicherweise, das kann man nicht so genau sagen; gibt Boards (z.B. von FSC), bei denen ist das immer so.

cu
Narses
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2562
Erhaltene Danke: 46

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Sa 13.08.05 21:56 
Vergesst es - ich selbst habe die Anweisung geschrieben, die den Beep auf dem Systemlautsprecher ausgibt... :oops:

Aber jetzt tritt ein anderes Problem auf, und diesmal bin ich nicht schuld: Wenn ich auf dem Systemlautsprecher beepen lasse, beept auch die Soundkarte. Wie kann ich das abstellen (es soll nur der Systemlautsprecher beepen)? Hier der Code, und Assembler kann ich nun wirklich nicht: :(
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
function InPort(PortAddr:word): byte; assemblerstdcall;
asm
 mov dx,PortAddr
 in al,dx
end;

procedure OutPort(PortAddr: word; Databyte: byte); assemblerstdcall;
asm
 mov al,Databyte
 mov dx,PortAddr
 out dx,al
end;

{Sound mit Systemlautsprecher ausgeben}
procedure Sound(Hz: Word; Duration: Integer);
var
  TmpW : Word;
begin
  if Hz < 1 then Hz := 1;  {Sonst Division durch 0}
  OutPort($43,182);
  TmpW :=InPort($61);
  OutPort($61,TmpW or 3);
  OutPort($42,lo(1193180 div hz));
  OutPort($42, hi(1193180 div hz));
  Sleep(Duration);
   {Den Ton beenden}
  OutPort($43,182);
  TmpW := InPort($61);
  OutPort($61,TmpW and 3);
end;

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!