| Autor |
Beitrag |
lanzelot
      
Beiträge: 16
|
Verfasst: 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).
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| begin windows.beep(697,2000);
windows.beep(1209+697,2000);
windows.beep(1209 and 697,2000);
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 raziel: Code- durch Delphi-Tags ersetzt.
|
|
uall@ogc
      
Beiträge: 1826
Erhaltene Danke: 11
Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
|
Verfasst: Fr 25.03.05 17:55
mit threads sollte es klappen wenn der speaker das überhaupt kann
bsp:
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 
      
Beiträge: 16
|
Verfasst: Fr 25.03.05 22:15
es funzt leider nicht  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:
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 public 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 AXMD: Code- durch Delphi-Tags ersetzt.
|
|
GTA-Place
      

Beiträge: 5248
Erhaltene Danke: 2
WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
|
Verfasst: Fr 25.03.05 22:20
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 
      
Beiträge: 16
|
Verfasst: 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:
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 public 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
      
Beiträge: 1098
Erhaltene Danke: 13
Win7 geg. WInXP oder sogar Win98
Rad2007
|
Verfasst: 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
      
Beiträge: 1826
Erhaltene Danke: 11
Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
|
Verfasst: 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
      

Beiträge: 5248
Erhaltene Danke: 2
WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
|
Verfasst: 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
      
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: 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 
      
Beiträge: 16
|
Verfasst: 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
      
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: Sa 26.03.05 18:17
Wenn du die Daten als Wav hast, dann nimm den TMediaPlayer. "Direktere" Methoden sind etwas komplizierter.
|
|
lanzelot 
      
Beiträge: 16
|
Verfasst: 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 
|
|
|