Autor Beitrag
lanzelot
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 16



BeitragVerfasst: Fr 25.03.05 17:48 
Hallo Zusammen

ich möchte DTMF Töne abspielen. DTMF Töne sind Tastentöne von einem Telefon. Sie bestehen immer aus 2 Tönen, die miteinander abgespielt werden. Ich schaffe es aber immer nur, einen Ton aufs mal abzuspielen.

Beispiel:
Der DTMF der Taste 1 besteht aus den Frequenzen 697 und 1209. Ich habe folgendes versucht:

Die 1. Zahl in der Klammer ist die Frequenz
Die 2. Zahl in der Klammer ist die dauer in millisekunden (hier immer 2000).

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
begin
//spielt ein Ton der Frequenz 697
windows.beep(697,2000);

//spielt ein Ton der Frequenz 1903 (1209+697)
windows.beep(1209+697,2000);

//spielt ein Ton der Tiefer ist, als beide einzeln
windows.beep(1209 and 697,2000);

//spielt beide Töne nacheinander ab
windows.beep(697,2000);
windows.beep(1209,2000);

end;


Ich schaffe es einfach nicht, beide Töne miteinander abzuspielen. Ich bin sehr froh, wenn mir jemand weiterhelfen kann.


Gruss

Lanzelot

Moderiert von user profile iconraziel: Code- durch Delphi-Tags ersetzt.
uall@ogc
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1826
Erhaltene Danke: 11

Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
BeitragVerfasst: Fr 25.03.05 17:55 
mit threads sollte es klappen wenn der speaker das überhaupt kann

bsp:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
function ton1(i: integer): integer; stdcall;
begin
  windows.beep(697,2000);
end;

function ton2(i: integer): integer; stdcall;
begin
  windows.beep(1209,2000);
end;


procedure spieletoenegleichzeitigab;
var tid: cardinal;
begin
  CreateThread(0,nil,@ton1,nil,0,tid);
 CreateThread(0,nil,@ton1,ni2,0,tid);
end;


hab das ausm kopf geschrieben ich weiß net ob das so richtig ist

_________________
wer andern eine grube gräbt hat ein grubengrabgerät
- oder einfach zu viel zeit
lanzelot Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 16



BeitragVerfasst: Fr 25.03.05 22:15 
es funzt leider nicht :cry: Da ich erst vor einem Monat mit dem Erlernen der Delphisprache begonnen habe und bislang noch nicht weiss, was threads sind, bin ich etwas aufgeschmissen.

Ich kann das Programm nicht kompilieren, es bleibt mir immer in der Zeile 45 stehen, also bei CreateThread...


ich habe das Programm nun so verknüpft, dass es beim anklicken von button1 beide Töne miteinander abspielen sollte:

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:
51:
52:
53:
unit Unit1;

interface

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

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

var
  Form1: TForm1;

implementation

{$R *.dfm}


function ton1(i: integer): integer; stdcall;
begin
  windows.beep(697,2000);  
end;  


function ton2(i: integer): integer; stdcall;  
begin  
  windows.beep(1209,2000);
end;  

 

 
procedure TForm1.Button1Click(Sender: TObject);

var tid: cardinal;
begin 
  CreateThread(0,nil,@ton1,nil,0,tid);
 CreateThread(0,nil,@ton1,ni2,0,tid);

end;


end;

end.


vielen Dank für euere Ratschläge.
Lanzelot

Moderiert von user profile iconAXMD: Code- durch Delphi-Tags ersetzt.
GTA-Place
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
EE-Regisseur
Beiträge: 5248
Erhaltene Danke: 2

WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
BeitragVerfasst: Fr 25.03.05 22:20 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure TForm1.Button1Click(Sender: TObject);  
var 
  tid: cardinal;  
begin   
  CreateThread(0, 0, @ton1, nil, 0, tid);  
  CreateThread(0, 0, @ton2, nil, 0, tid);
end;



EDIT: Da sind noch mehr Fehler.
EDIT2: Sollte jetzt stimmen.

_________________
"Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
lanzelot Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 16



BeitragVerfasst: Fr 25.03.05 22:36 
Nun läuft das Programm. Jedoch macht es noch nicht das richtige. Wenn ich denn button1 anklicke spielt es den tieferen Ton. Wenn ich ein weiteres mal draufklicke, spielt es den höheren :?
Wie kriege ich es hin, dass beide miteinader abgespielt werden?

hier nochmals das Programm:

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:
unit Unit1;

interface

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

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

var
  Form1: TForm1;

implementation

{$R *.dfm}


function ton1(i: integer): integer; stdcall;
begin
  windows.beep(697,2000);
end;


function ton2(i: integer): integer; stdcall;
begin
  windows.beep(1209,2000);
end;




procedure TForm1.Button1Click(Sender: TObject);

var tid: cardinal;
begin
  CreateThread(0, 0, @ton1, nil, 0, tid);
  CreateThread(0, 0, @ton2, nil, 0, tid);
end;


end.
Tilo
ontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 1098
Erhaltene Danke: 13

Win7 geg. WInXP oder sogar Win98
Rad2007
BeitragVerfasst: Sa 26.03.05 09:15 
Vorschlag zu einem anderem Vorgehen:
Die entsprechenden DTMF-Töne in Wave-Dateien speichern und diese dann abspielen.
uall@ogc
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1826
Erhaltene Danke: 11

Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
BeitragVerfasst: Sa 26.03.05 10:56 
dan kann man mit dem speaker nicht 2 töne gleichzeitig abspielen...

_________________
wer andern eine grube gräbt hat ein grubengrabgerät
- oder einfach zu viel zeit
GTA-Place
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
EE-Regisseur
Beiträge: 5248
Erhaltene Danke: 2

WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
BeitragVerfasst: Sa 26.03.05 11:16 
Beep geht doch übern PC-Lautsprecher (also der im PC).
Der kann bestimmt nur einen abspielen.

_________________
"Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Sa 26.03.05 12:23 
Der PC-Speaker wurde (früher zu mindest) von einem PIC-Chip angetrieben und konnte nur Rechteck-Signale erzeugen. Rechteck-Signale sind 1. keine Sinusschwingungen (sie haben ne Menge Obertöne) und 2. kann man natürlich nicht 2 Töne überlagern.
Einzige Lösung: Über Soundkarte abspielen.
lanzelot Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 16



BeitragVerfasst: Sa 26.03.05 18:02 
Es stimmt, dass das Signal über den PC-Lautsprecher wiedergegeben wird. Das habe ich aber nur so gemacht, weil ich keinen anderen Befehl kannte. Am schluss müsste es nämlich über die Soundkarte raus, da ich an meiner Soundkarte mein Telefon anhängen möchte. Also Stimme und DTMF, alles über Soundkarte.
Gibt es einen Befehl, bei dem der Ton über die Soundkarte rausgeht?
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Sa 26.03.05 18:17 
Wenn du die Daten als Wav hast, dann nimm den TMediaPlayer. "Direktere" Methoden sind etwas komplizierter.
lanzelot Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 16



BeitragVerfasst: So 27.03.05 16:13 
Obwohl ich es jetzt nicht so gemacht habe, wie ich es ursprünglich wollte, bin ich trotzdem zum Ziel gekommen. Habe dtmf in wav-datei gespeichert.

vielen Dank für euere Hilfe, bin echt froh :lol: