ΠΠ°ΡΠ΅ΡΠΈΠ°Π»ΡΡ Π½Π° ΡΡΠ°ΡΠΈΡΡΠ° Π΅ Π²Π·Π΅Ρ ΠΎΡ ΠΌΠΎΡ .
ΠΡΠΊΡΠΈΠ²Π°ΡΠ΅Π» Π½Π° ΡΠΎΠ½Π°Π»Π΅Π½ ΡΠΈΠ³Π½Π°Π»
Π ΠΌΠΈΠ½Π°Π»ΠΎΡΠΎ Π‘ΡΠ·Π΄Π°Π΄ΠΎΡ ΠΌΠ΅ ΠΈΠ·ΠΌΠ΅ΡΠΈΡΠ΅Π» Π½Π° Π½ΠΈΠ²ΠΎΡΠΎ Π½Π° ΡΠΈΠ³Π½Π°Π»Π°. Π ΡΠΎΠ²Π°, ΡΠ΅ Π½Π°ΡΡΠΈΠΌ ΠΊΠ°ΠΊ Π΄Π° ΠΎΡΠΊΡΠΈΠ΅ΠΌ ΡΠΎΠ½Π°Π»Π΅Π½ ΡΠΈΠ³Π½Π°Π».
![]()
Π ΡΡΠ°ΡΠΈ Π²ΡΠ΅ΠΌΠ΅Π½Π°, ΠΊΠΎΠ³Π°ΡΠΎ Π½Π΅ Π²ΡΡΠΊΠΎ ΡΠ΅ΠΌΠ΅ΠΉΡΡΠ²ΠΎ ΠΈΠΌΠ°ΡΠ΅ ΡΠ΅Π»Π΅Π²ΠΈΠ·ΠΎΡ, ΠΈ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Π°ΡΠ° ΠΎΡ ΡΡΡ ΡΠΌΠ΅Π½ΡΡ Π° ΠΊΠ°Π½Π°Π»ΠΈΡΠ΅ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° ΠΊΠ»Π΅ΡΠΈ, Π² ΠΏΡΠ΅Π³Π»Π΅Π΄ΠΈΡΠ΅ Π½Π° ΡΡΠΆΠ΄Π΅ΡΡΡΠ°Π½Π½Π°ΡΠ° ΡΠ΅Ρ Π½ΠΈΡΠ΅ΡΠΊΠ° ΠΏΡΠ΅ΡΠ° ΡΠ΅ ΠΏΠΎΡΠ²ΠΈ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½Π° Π½ΠΎΠ²ΠΈΠ½Π°, ΡΠ΅ Π΅Π΄ΠΈΠ½ ΠΎΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΠΈΡΠ΅ Π½Π° ΡΠ΅Π»Π΅Π²ΠΈΠ·ΠΎΡΠΈ Π΅ ΡΠ½Π°Π±Π΄ΠΈΠ» ΡΠ²ΠΎΠΈΡΠ΅ Π°ΠΏΠ°ΡΠ°ΡΠΈ Ρ Π΄ΠΈΡΡΠ°Π½ΡΠΈΠΎΠ½Π½ΠΎ Π±Π΅Π·ΠΆΠΈΡΠ½ΠΎ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅. ΠΡ Π΄Π΅ΡΠ°ΠΉΠ»ΠΈΡΠ΅ Π±Π΅ΡΠ΅ ΠΈΠ·Π²Π΅ΡΡΠ½ΠΎ, ΡΠ΅ Π΄ΠΈΡΡΠ°Π½ΡΠΈΠΎΠ½Π½ΠΎΡΠΎ ΡΠ°Π±ΠΎΡΠΈ Π±Π΅Π· Π±Π°ΡΠ΅ΡΠΈΠΈ Π±Π»Π°Π³ΠΎΠ΄Π°ΡΠ΅Π½ΠΈΠ΅ Π½Π° Π½Π΅ΠΎΠ±ΠΈΡΠ°Π΅Π½ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ - Π΄ΠΈΡΡΠ°Π½ΡΠΈΠΎΠ½Π½ΠΎΡΠΎ Π±Π΅ΡΠ΅ ΠΌΠ΅Ρ Π°Π½ΠΈΡΠ½ΠΎ ΠΈ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ²Π°ΡΠ΅ Ρ ΠΈΠ±ΡΠΈΠ΄ Π½Π° ΠΌΡΠ·ΠΈΠΊΠ°Π»Π΅Π½ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ - ΠΌΠ΅ΡΠ°Π»ΠΎΡΠΎΠ½ ΠΈ ΡΠ΅Π²ΠΎΠ»Π²Π΅Ρ. Π Π±Π°ΡΠ°Π±Π°Π½Π° Π½Π° ΡΠ΅Π²ΠΎΠ»Π²Π΅ΡΠ° ΠΈΠΌΠ°ΡΠ΅ ΠΌΠ΅ΡΠ°Π»Π½ΠΈ ΡΠΈΠ»ΠΈΠ½Π΄ΡΠΈ Ρ ΡΠ°Π·Π»ΠΈΡΠ½Π° Π΄ΡΠ»ΠΆΠΈΠ½Π° ΠΈ ΠΊΠΎΠ³Π°ΡΠΎ ΡΠ΄Π°ΡΠ½ΠΈΠΊΡΡ ΡΠ΄ΡΡΡΠ΅ Π΅Π΄ΠΈΠ½ ΠΎΡ ΡΡΡ , ΡΠΈΠ»ΠΈΠ½Π΄ΡΡΡΡ Π·Π°ΠΏΠΎΡΠ²Π°ΡΠ΅ Π΄Π° Π·Π²ΡΠ½ΠΈ Π½Π° ΡΠΎΠ±ΡΡΠ²Π΅Π½Π°ΡΠ° ΡΠΈ ΡΠ΅ΡΡΠΎΡΠ°. ΠΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅ΠΌΠΎ Π½Π° ΡΠ»ΡΡΠ°Π·Π²ΡΠΊ. ΠΠ»Π΅ΠΊΡΡΠΎΠ½ΠΈΠΊΠ°ΡΠ° Π² ΡΠ΅Π»Π΅Π²ΠΈΠ·ΠΎΡΠ° ΡΠ»Π°Π²ΡΡΠ΅ ΡΠΎΠ·ΠΈ ΡΠΈΠ³Π½Π°Π» ΠΈ, ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ²Π°ΠΉΠΊΠΈ Π½Π΅Π³ΠΎΠ²Π°ΡΠ° ΡΠ΅ΡΡΠΎΡΠ°, ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π°ΡΠ΅ ΡΡΠΎΡΠ²Π΅ΡΠ½ΠΎΡΠΎ Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ - ΡΠΌΠ΅Π½ΡΡΠ΅ ΠΊΠ°Π½Π°Π»Π°, ΠΏΡΠΎΠΌΠ΅Π½ΡΡΠ΅ ΡΠΈΠ»Π°ΡΠ° Π½Π° Π·Π²ΡΠΊΠ°, ΠΈΠ·ΠΊΠ»ΡΡΠ²Π°ΡΠ΅ ΡΠ΅Π»Π΅Π²ΠΈΠ·ΠΎΡΠ°.
ΠΠ½Π΅Ρ ΡΠ΅ ΠΎΠΏΠΈΡΠ°ΠΌΠ΅ Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΠΌ ΡΠ΅ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΡ Π½Π° ΡΠ°Π·ΠΈ ΡΠΈΡΡΠ΅ΠΌΠ° Π·Π° ΠΏΡΠ΅Π΄Π°Π²Π°Π½Π΅ Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ Π½Π°ΡΠΈΡΠ΅ Π·Π½Π°Π½ΠΈΡ Π·Π° ΠΌΠ΅Π΄ΠΈΠ°ΡΡΡΠΈΠΌΠ΅ΡΠ°.
ΠΠ° ΠΈΠΌΠΈΡΠ°ΡΠΈΡ Π½Π° Π΄ΠΈΡΡΠ°Π½ΡΠΈΠΎΠ½Π½ΠΎΡΠΎ, ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ ΡΠ΅ΠΊΡΡΠ° Π½Π° Π½Π°ΡΠΈΡ ΠΏΡΠΈΠΌΠ΅Ρ Π·Π° ΡΠΎΠ½Π°Π»Π΅Π½ Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡ. Π©Π΅ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° ΡΠ΅ΡΡΠΎΡΠ°ΡΠ° Π½Π° Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡΠ° ΠΎΡ Π½Π°ΡΠΈΡΠΊΠ°Π½ΠΈΡ Ρ ΠΊΠ»Π°Π²ΠΈΠ°ΡΡΡΠ°ΡΠ° ΠΈ ΠΏΡΠΈΠ΅ΠΌΠ½ΠΈΠΊ Ρ Π΄Π΅ΠΊΠΎΠ΄Π΅Ρ, ΠΊΠΎΠΉΡΠΎ ΡΠ΅ ΠΏΠΎΠΊΠ°Π·Π²Π° ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ Π² ΠΊΠΎΠ½Π·ΠΎΠ»Π°ΡΠ°. Π‘Π»Π΅Π΄ ΠΏΡΠΎΠΌΠ΅Π½ΠΈΡΠ΅, Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡΡΡ ΡΡΡΠ±Π²Π° Π΄Π° ΠΏΡΠΎΠΈΠ·Π²Π΅ΠΆΠ΄Π° ΡΠΎΠ½Π°Π»Π½ΠΈ ΡΠΈΠ³Π½Π°Π»ΠΈ Ρ 6 ΡΠ΅ΡΡΠΎΡΠΈ, Ρ ΠΊΠΎΠΈΡΠΎ ΡΠ΅ ΠΊΠΎΠ΄ΠΈΡΠ° ΠΊΠΎΠΌΠ°Π½Π΄ΠΈΡΠ΅ Π·Π° ΡΠ²Π΅Π»ΠΈΡΠ°Π²Π°Π½Π΅/Π½Π°ΠΌΠ°Π»ΡΠ²Π°Π½Π΅ Π½Π° Π·Π²ΡΠΊΠ°, ΡΠΌΡΠ½Π° Π½Π° ΠΊΠ°Π½Π°Π»Π°, Π²ΠΊΠ»ΡΡΠ²Π°Π½Π΅/ΠΈΠ·ΠΊΠ»ΡΡΠ²Π°Π½Π΅ Π½Π° ΡΠ΅Π»Π΅Π²ΠΈΠ·ΠΎΡΠ°. ΠΠ° Π½Π°ΡΡΡΠΎΠΉΠΊΠ° Π½Π° Π΄Π΅ΡΠ΅ΠΊΡΠΎΡΠ° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΡΡΡΡΠΊΡΡΡΠ°:
struct _MSToneDetectorDef{
char tone_name[8];
int frequency; \/**<ΠΡΠ°ΠΊΠ²Π°Π½Π° ΡΠ΅ΡΡΠΎΡΠ° Π½Π° ΡΠΎΠ½Π°*\/
int min_duration; \/**<ΠΠΈΠ½. ΠΏΡΠΎΠ΄ΡΠ»ΠΆΠΈΡΠ΅Π»Π½ΠΎΡΡ Π½Π° ΡΠΎΠ½Π° Π² ΠΌΠΈΠ»ΠΈΡΠ΅ΠΊΡΠ½Π΄ΠΈ *\/
float min_amplitude; \/**<ΠΠΈΠ½ΠΈΠΌΠ°Π»Π½Π° Π°ΠΌΠΏΠ»ΠΈΡΡΠ΄Π° Π½Π° ΡΠΎΠ½Π°, 1.0 ΡΡΠΎΡΠ²Π΅ΡΡΡΠ²Π° Π½Π° Π½ΠΎΡΠΌΠ°Π»ΠΈΠ·ΠΈΡΠ°Π½ΠΎΡΠΎ 0dbm Π½ΠΈΠ²ΠΎ *\/\n};\n\ntypedef struct _MSToneDetectorDef MSToneDetectorDef;ΠΠ° Π΄Π΅ΡΠ΅ΠΊΡΠΎΡΠ° ΠΌΠΎΠ³Π°Ρ Π΄Π° ΡΠ΅ ΠΏΡΠ΅Π΄Π°Π΄Π°Ρ 10 ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΈ ΡΡΡΡΠΊΡΡΡΠΈ, ΠΏΠΎ ΡΠΎΠ·ΠΈ Π½Π°ΡΠΈΠ½ Π΅Π΄ΠΈΠ½ Π΄Π΅ΡΠ΅ΠΊΡΠΎΡ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ Π½Π°ΡΡΡΠΎΠ΅Π½ Π·Π° ΠΎΡΠΊΡΠΈΠ²Π°Π½Π΅ Π½Π° Π΄Π΅ΡΠ΅Ρ Π΄Π²ΡΡΠΎΠ½Π°Π»Π½ΠΈ ΡΠΈΠ³Π½Π°Π»Π°. ΠΠΎ Π½ΠΈΠ΅ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ ΡΠ°ΠΌΠΎ ΡΠ΅ΡΡ Π΅Π΄Π½ΠΎΡΠΎΠ½ΠΎΠ²ΠΈ ΡΠΈΠ³Π½Π°Π»Π°. ΠΠ° ΠΏΡΠ΅Π΄Π°Π²Π°Π½Π΅ Π½Π° Π½Π°ΡΡΡΠΎΠΉΠΊΠΈΡΠ΅ Π½Π° Π΄Π΅ΡΠ΅ΠΊΡΠΎΡΠ° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΌΠ΅ΡΠΎΠ΄ΡΡ MS_TONE_DETECTOR_ADD_SCAN.
ΠΠ° Π΄Π° ΠΌΠΎΠΆΠ΅ Π΄Π΅ΡΠ΅ΠΊΡΠΎΡΡΡ Π΄Π° Π½ΠΈ ΡΠ²Π΅Π΄ΠΎΠΌΠΈ, ΡΠ΅ Π΅ ΠΏΠΎΠ»ΡΡΠΈΠ» ΡΠΈΠ³Π½Π°Π» Ρ ΡΡΡΡΠ΅Π½ΠΈΡΠ΅ ΡΠ΅ΡΡΠΎΡΠ½ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΈ, ΡΡΡΠ±Π²Π° Π΄Π° ΠΌΡ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²ΠΈΠΌ ΡΡΠ½ΠΊΡΠΈΡ Π·Π° ΠΎΠ±ΡΠ°ΡΠ½ΠΎ ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅, ΠΊΠΎΡΡΠΎ ΡΠΎΠΉ ΡΠ΅ ΠΈΠ·ΠΏΡΠ»Π½ΠΈ ΠΏΡΠΈ ΡΠ°ΠΊΡΠ² ΡΠ»ΡΡΠ°ΠΉ. Π’ΠΎΠ²Π° ΡΠ΅ ΠΏΡΠ°Π²ΠΈ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° ΡΡΠ½ΠΊΡΠΈΡΡΠ° ms_filter_set_notify_callback(). ΠΠ°ΡΠΎ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΈ ΡΡ ΠΏΠΎΠ»ΡΡΠ°Π²Π° ΡΠΊΠ°Π·Π°ΡΠ΅Π» ΠΊΡΠΌ ΡΠΈΠ»ΡΡΡΠ°, ΡΠΊΠ°Π·Π°ΡΠ΅Π» ΠΊΡΠΌ ΡΡΠ½ΠΊΡΠΈΡΡΠ° Π·Π° ΠΎΠ±ΡΠ°ΡΠ½ΠΎ ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅ ΠΈ ΡΠΊΠ°Π·Π°ΡΠ΅Π» ΠΊΡΠΌ Π΄Π°Π½Π½ΠΈ, ΠΊΠΎΠΈΡΠΎ ΠΈΡΠΊΠ°ΠΌΠ΅ Π΄Π° ΠΏΡΠ΅Π΄Π°Π΄Π΅ΠΌ Π½Π° ΡΡΠ½ΠΊΡΠΈΡΡΠ° Π·Π° ΠΎΠ±ΡΠ°ΡΠ½ΠΎ ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅ (ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΠΊΠΈ Π΄Π°Π½Π½ΠΈ).
ΠΡΠΈ ΡΡΠ°Π±ΠΎΡΠ²Π°Π½Π΅ Π½Π° Π΄Π΅ΡΠ΅ΠΊΡΠΎΡΠ° ΡΡΠ½ΠΊΡΠΈΡΡΠ° Π·Π° ΠΎΠ±ΡΠ°ΡΠ½ΠΎ ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅ ΡΠ΅ ΠΏΠΎΠ»ΡΡΠΈ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΠΊΠΈΡΠ΅ Π΄Π°Π½Π½ΠΈ, ΡΠΊΠ°Π·Π°ΡΠ΅Π» ΠΊΡΠΌ Π΄Π΅ΡΠ΅ΠΊΡΠΎΡΠ½ΠΈΡ ΡΠΈΠ»ΡΡΡ, ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ Π½Π° ΡΡΠ±ΠΈΡΠΈΠ΅ΡΠΎ ΠΈ ΡΡΡΡΠΊΡΡΡΠ°, ΠΎΠΏΠΈΡΠ²Π°ΡΠ° ΡΡΠ±ΠΈΡΠΈΠ΅ΡΠΎ:
/** * Structure carried as argument of the MS_TONE_DETECTOR_EVENT**/
struct _MSToneDetectorEvent{
char tone_name[8]; /* ΠΠΌΡ ΡΠΎΠ½Π° ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΌΡ Π΅ΠΌΡ Π½Π°Π·Π½Π°ΡΠΈΠ»ΠΈ ΠΏΡΠΈ Π½Π°ΡΡΡΠΎΠΉΠΊΠ΅ Π΄Π΅ΡΠ΅ΠΊΡΠΎΡΠ°. */
uint64_t tone_start_time; /* ΠΡΠ΅ΠΌΡ Π² ΠΌΠΈΠ»Π»ΠΈΡΠ΅ΠΊΡΠ½Π΄Π°Ρ
, ΠΊΠΎΠ³Π΄Π° ΡΠΎΠ½ Π±ΡΠ» ΠΎΠ±Π½Π°ΡΡΠΆΠ΅Π½. */
};
typedef struct _MSToneDetectorEvent MSToneDetectorEvent;
Π‘ΡΡΡΠΊΡΡΡΠ½Π°ΡΠ° ΡΡ Π΅ΠΌΠ° Π½Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° ΡΠΈΠ³Π½Π°Π»Π° Π΅ ΠΏΠΎΠΊΠ°Π·Π°Π½Π° Π½Π° Π·Π°Π³Π»Π°Π²Π½Π°ΡΠ° ΠΊΠ°ΡΡΠΈΠ½ΠΊΠ°.
Π‘Π΅Π³Π° Π΅ Π²ΡΠ΅ΠΌΠ΅ Π·Π° ΡΠ°ΠΌΠΈΡ ΠΊΠΎΠ΄ Π½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ° Ρ ΠΊΠΎΠΌΠ΅Π½ΡΠ°ΡΠΈ.
/* Π€Π°ΠΉΠ» mstest4.c ΠΠΌΠΈΡΠ°ΡΠΎΡ ΠΏΡΠ»ΡΡΠ° ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΈ ΠΏΡΠΈΠ΅ΠΌΠ½ΠΈΠΊΠ°. */
#include <mediastreamer2/msfilter.h>
#include <mediastreamer2/msticker.h>
#include <mediastreamer2/dtmfgen.h>
#include <mediastreamer2/mssndcard.h>
#include <mediastreamer2/msvolume.h>
#include <mediastreamer2/mstonedetector.h>
/* ΠΠΎΠ΄ΠΊΠ»ΡΡΠ°Π΅ΠΌ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡΠ½ΡΠΉ ΡΠ°ΠΉΠ» Ρ ΡΡΠ½ΠΊΡΠΈΡΠΌΠΈ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΡΠΎΠ±ΡΡΠΈΡΠΌΠΈ
* ΠΌΠ΅Π΄ΠΈΠ°ΡΡΡΠΈΠΌΠ΅ΡΠ°. */
#include <mediastreamer2/mseventqueue.h>
/* Π€ΡΠ½ΠΊΡΠΈΡ ΠΎΠ±ΡΠ°ΡΠ½ΠΎΠ³ΠΎ Π²ΡΠ·ΠΎΠ²Π°, ΠΎΠ½Π° Π±ΡΠ΄Π΅Ρ Π²ΡΠ·Π²Π°Π½Π° ΡΠΈΠ»ΡΡΡΠΎΠΌ, ΠΊΠ°ΠΊ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ½
* ΠΎΠ±Π½Π°ΡΡΠΆΠΈΡ ΡΠΎΠ²ΠΏΠ°Π΄Π΅Π½ΠΈΠ΅ Ρ
Π°ΡΠ°ΠΊΡΠ΅ΡΠΈΡΡΠΈΠΊ Π²Ρ
ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΠΈΠ³Π½Π°Π»Π° Ρ Π·Π°Π΄Π°Π½Π½ΡΠΌΠΈ. */
static void tone_detected_cb(void *data, MSFilter *f, unsigned int event_id,
MSToneDetectorEvent *ev)
{
printf(" ΠΡΠΈΠ½ΡΡΠ° ΠΊΠΎΠΌΠ°Π½Π΄Π°: %sn", ev->tone_name);
}
int main()
{
ms_init();
/* Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΡ ΡΠΈΠ»ΡΡΡΠΎΠ². */
MSFilter *voidsource = ms_filter_new(MS_VOID_SOURCE_ID);
MSFilter *dtmfgen = ms_filter_new(MS_DTMF_GEN_ID);
MSFilter *volume = ms_filter_new(MS_VOLUME_ID);
MSSndCard *card_playback =
ms_snd_card_manager_get_default_card(ms_snd_card_manager_get());
MSFilter *snd_card_write = ms_snd_card_create_writer(card_playback);
MSFilter *detector = ms_filter_new(MS_TONE_DETECTOR_ID);
/* ΠΡΠΈΡΠ°Π΅ΠΌ ΠΌΠ°ΡΡΠΈΠ² Π½Π°Ρ
ΠΎΠ΄ΡΡΠΈΠΉΡΡ Π²Π½ΡΡΡΠΈ Π΄Π΅ΡΠ΅ΠΊΡΠΎΡΠ° ΡΠΎΠ½ΠΎΠ², ΠΎΠ½ ΠΎΠΏΠΈΡΡΠ²Π°Π΅Ρ
* ΠΎΡΠΎΠ±ΡΠ΅ ΠΏΡΠΈΠΌΠ΅ΡΡ ΡΠ°Π·ΡΡΠΊΠΈΠ²Π°Π΅ΠΌΡΡ
ΡΠΈΠ³Π½Π°Π»ΠΎΠ².*/
ms_filter_call_method(detector, MS_TONE_DETECTOR_CLEAR_SCANS, 0);
/* Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ ΠΈΡΡΠΎΡΠ½ΠΈΠΊ ΡΠ°ΠΊΡΠΎΠ² - ΡΠΈΠΊΠ΅Ρ. */
MSTicker *ticker=ms_ticker_new();
/* Π‘ΠΎΠ΅Π΄ΠΈΠ½ΡΠ΅ΠΌ ΡΠΈΠ»ΡΡΡΡ Π² ΡΠ΅ΠΏΠΎΡΠΊΡ. */
ms_filter_link(voidsource, 0, dtmfgen, 0);
ms_filter_link(dtmfgen, 0, volume, 0);
ms_filter_link(volume, 0, detector, 0);
ms_filter_link(detector, 0, snd_card_write, 0);
/* ΠΠΎΠ΄ΠΊΠ»ΡΡΠ°Π΅ΠΌ ΠΊ ΡΠΈΠ»ΡΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ ΠΎΠ±ΡΠ°ΡΠ½ΠΎΠ³ΠΎ Π²ΡΠ·ΠΎΠ²Π°. */
ms_filter_set_notify_callback(detector,
(MSFilterNotifyFunc)tone_detected_cb, NULL);
/* ΠΠΎΠ΄ΠΊΠ»ΡΡΠ°Π΅ΠΌ ΠΈΡΡΠΎΡΠ½ΠΈΠΊ ΡΠ°ΠΊΡΠΎΠ². */
ms_ticker_attach(ticker,voidsource);
/* Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ ΠΌΠ°ΡΡΠΈΠ², ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΠΎΠΏΠΈΡΡΠ²Π°Π΅Ρ Ρ
Π°ΡΠ°ΠΊΡΠ΅ΡΠΈΡΡΠΈΠΊΡ
* ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· ΡΠΎΠ½ΠΎΠ², ΠΊΠΎΡΠΎΡΡΠΉ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΠΎΠ±Π½Π°ΡΡΠΆΠΈΠ²Π°ΡΡ: Π’Π΅ΠΊΡΡΠΎΠ²ΠΎΠ΅ ΠΈΠΌΡ
* Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°, ΡΠ°ΡΡΠΎΡΠ° Π² Π³Π΅ΡΡΠ°Ρ
, Π΄Π»ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ Π² ΠΌΠΈΠ»Π»ΠΈΡΠ΅ΠΊΡΠ½Π΄Π°Ρ
,
* ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΡΠΉ ΡΡΠΎΠ²Π΅Π½Ρ ΠΎΡΠ½ΠΎΡΠΈΡΠ΅Π»ΡΠ½ΠΎ 0,775Π. */
MSToneDetectorDef scan[6]=
{
{"V+", 440, 100, 0.1}, /* ΠΠΎΠΌΠ°Π½Π΄Π° "Π£Π²Π΅Π»ΠΈΡΠΈΡΡ Π³ΡΠΎΠΌΠΊΠΎΡΡΡ". */
{"V-", 540, 100, 0.1}, /* ΠΠΎΠΌΠ°Π½Π΄Π° "Π£ΠΌΠ΅Π½ΡΡΠΈΡΡ Π³ΡΠΎΠΌΠΊΠΎΡΡΡ". */
{"C+", 640, 100, 0.1}, /* ΠΠΎΠΌΠ°Π½Π΄Π° "Π£Π²Π΅Π»ΠΈΡΠΈΡΡ Π½ΠΎΠΌΠ΅Ρ ΠΊΠ°Π½Π°Π»Π°". */
{"C-", 740, 100, 0.1}, /* ΠΠΎΠΌΠ°Π½Π΄Π° "Π£ΠΌΠ΅Π½ΡΡΠΈΡΡ Π½ΠΎΠΌΠ΅Ρ ΠΊΠ°Π½Π°Π»Π°". */
{"ON", 840, 100, 0.1}, /* ΠΠΎΠΌΠ°Π½Π΄Π° "ΠΠΊΠ»ΡΡΠΈΡΡ ΡΠ΅Π»Π΅Π²ΠΈΠ·ΠΎΡ". */
{"OFF", 940, 100, 0.1} /* ΠΠΎΠΌΠ°Π½Π΄Π° "ΠΡΠΊΠ»ΡΡΠΈΡΡ ΡΠ΅Π»Π΅Π²ΠΈΠ·ΠΎΡ". */
};
/* ΠΠ΅ΡΠ΅Π΄Π°Π΅ΠΌ Π² Π΄Π΅ΡΠ΅ΠΊΡΠΎΡ ΡΠΎΠ½ΠΎΠ² ΠΏΡΠΈΠΌΠ΅ΡΡ ΡΠΈΠ³Π½Π°Π»ΠΎΠ². */
int i;
for (i = 0; i < 6; i++)
{
ms_filter_call_method(detector, MS_TONE_DETECTOR_ADD_SCAN,
&scan[i]);
}
/* ΠΠ°ΡΡΡΠ°ΠΈΠ²Π°Π΅ΠΌ ΡΡΡΡΠΊΡΡΡΡ, ΡΠΏΡΠ°Π²Π»ΡΡΡΡΡ Π²ΡΡ
ΠΎΠ΄Π½ΡΠΌ ΡΠΈΠ³Π½Π°Π»ΠΎΠΌ Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡΠ°.*/
MSDtmfGenCustomTone dtmf_cfg;
dtmf_cfg.tone_name[0] = 0;
dtmf_cfg.duration = 1000;
dtmf_cfg.frequencies[0] = 440;
/* ΠΡΠ΄Π΅ΠΌ Π³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°ΡΡ ΠΎΠ΄ΠΈΠ½ ΡΠΎΠ½, ΡΠ°ΡΡΠΎΡΡ Π²ΡΠΎΡΠΎΠ³ΠΎ ΡΠΎΠ½Π° ΡΡΡΠ°Π½ΠΎΠ²ΠΈΠΌ Π² 0.*/
dtmf_cfg.frequencies[1] = 0;
dtmf_cfg.amplitude = 1.0;
dtmf_cfg.interval = 0.;
dtmf_cfg.repeat_count = 0.;
/* ΠΡΠ³Π°Π½ΠΈΠ·ΡΠ΅ΠΌ ΡΠΈΠΊΠ» ΡΠΊΠ°Π½ΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π½Π°ΠΆΠ°ΡΡΡ
ΠΊΠ»Π°Π²ΠΈΡ. ΠΠ²ΠΎΠ΄ Π½ΡΠ»Ρ Π·Π°Π²Π΅ΡΡΠ°Π΅Ρ
* ΡΠΈΠΊΠ» ΠΈ ΡΠ°Π±ΠΎΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ. */
char key='9';
printf("ΠΠ°ΠΆΠΌΠΈΡΠ΅ ΠΊΠ»Π°Π²ΠΈΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ, Π·Π°ΡΠ΅ΠΌ Π²Π²ΠΎΠ΄.n"
"ΠΠ»Ρ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π²Π²Π΅Π΄ΠΈΡΠ΅ 0.n");
while(key != '0')
{
key = getchar();
if ((key >= 49) && (key <= 54))
{
printf("ΠΡΠΏΡΠ°Π²Π»Π΅Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°: %cn", key);
/* Π£ΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΠΌ ΡΠ°ΡΡΠΎΡΡ Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡΠ° Π² ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠΈ Ρ
* ΠΊΠΎΠ΄ΠΎΠΌ Π½Π°ΠΆΠ°ΡΠΎΠΉ ΠΊΠ»Π°Π²ΠΈΡΠΈ.*/
dtmf_cfg.frequencies[0] = 440 + 100*(key-49);
/* ΠΠΊΠ»ΡΡΠ°Π΅ΠΌ Π·Π²ΡΠΊΠΎΠ²ΠΎΠΉ Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡ c ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½Π½ΠΎΠΉ ΡΠ°ΡΡΠΎΡΠΎΠΉ. */
ms_filter_call_method(dtmfgen, MS_DTMF_GEN_PLAY_CUSTOM,
(void*)&dtmf_cfg);
}
ms_usleep(20000);
}
}ΠΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ°ΠΌΠ΅ ΠΈ ΡΡΠ°ΡΡΠΈΡΠ°ΠΌΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ°. ΠΠΊΠΎ Π²ΡΠΈΡΠΊΠΎ ΡΠ°Π±ΠΎΡΠΈ ΠΏΡΠ°Π²ΠΈΠ»Π½ΠΎ, ΡΠ»Π΅Π΄ ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ ΡΡΡΠ±Π²Π° Π΄Π° ΠΏΠΎΠ»ΡΡΠΈΠΌ ΠΎΠΊΠΎΠ»ΠΎ ΡΠ»Π΅Π΄Π½ΠΎΡΠΎ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ°:
$ ./mstest4
ALSA lib conf.c:4738:(snd_config_expand) ΠΠ΅ΠΏΠΎΠ·Π½Π°ΡΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ 0
ALSA lib control.c:954:(snd_ctl_open_noupdate) ΠΠ΅Π²Π°Π»ΠΈΠ΄Π΅Π½ CTL default:0
ortp-warning-ΠΠ΅ ΠΌΠΎΠΆΠ° Π΄Π° ΡΠ΅ ΡΠ²ΡΡΠΆΠ΅ ΠΌΠΈΠΊΡΠ΅ΡΠ° Ρ ΠΊΠ°ΡΡΠ°ΡΠ°: ΠΠ΅Π²Π°Π»ΠΈΠ΄Π΅Π½ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ
ALSA lib conf.c:4738:(snd_config_expand) ΠΠ΅ΠΏΠΎΠ·Π½Π°ΡΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ 0
ALSA lib pcm.c:2266:(snd_pcm_open_noupdate) ΠΠ΅Π²Π°Π»ΠΈΠ΄Π΅Π½ PCM default:0
ALSA lib conf.c:4738:(snd_config_expand) ΠΠ΅ΠΏΠΎΠ·Π½Π°ΡΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ 0
ALSA lib pcm.c:2266:(snd_pcm_open_noupdate) ΠΠ΅Π²Π°Π»ΠΈΠ΄Π΅Π½ PCM default:0
ortp-warning-Π‘ΡΡΠ°Π½Π½ΠΎ, Π·Π²ΡΠΊΠΎΠ²Π°ΡΠ° ΠΊΠ°ΡΡΠ° Intel 82801AA-ICH Π½Π΅ ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° Π΄Π° Π΅ ΡΠΏΠΎΡΠΎΠ±Π½Π° Π½Π° Π½Π΅ΡΠΎ, ΠΎΠΏΠΈΡΠ²Π° ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎ Ρ plughw...
ΠΠ°ΡΠΈΡΠ½Π΅ΡΠ΅ ΠΊΠ»Π°Π²ΠΈΡΠ° Π·Π° ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈ ΡΠ»Π΅Π΄ ΡΠΎΠ²Π° Enter.
ΠΠ° Π΄Π° Π·Π°Π²ΡΡΡΠΈΡΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ°, Π²ΡΠ²Π΅Π΄Π΅ΡΠ΅ 0.
ortp-warning-alsa_set_params: periodsize:256 ΠΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° 256
ortp-warning-alsa_set_params: period:8 ΠΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° 8
ΠΠ°ΡΠΈΡΠΊΠ°ΠΌΠ΅ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»Π½ΠΈ ΠΊΠ»Π°Π²ΠΈΡΠΈ ΠΎΡ '1' Π΄ΠΎ '6', ΠΏΠΎΡΠ²ΡΡΠ΄ΡΠ²Π°ΠΉΠΊΠΈ Ρ 'Enter', ΡΡΡΠ±Π²Π° Π΄Π° ΠΏΠΎΠ»ΡΡΠΈΠΌ ΠΏΡΠΈΠ±Π»ΠΈΠ·ΠΈΡΠ΅Π»Π½ΠΎ ΡΠ°ΠΊΡΠ² ΡΠΏΠΈΡΡΠΊ:
2
ΠΠ·ΠΏΡΠ°ΡΠ΅Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°: 2
ΠΡΠΈΠ½ΡΡΠ° ΠΊΠΎΠΌΠ°Π½Π΄Π°: V-
1
ΠΠ·ΠΏΡΠ°ΡΠ΅Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°: 1
ΠΡΠΈΠ½ΡΡΠ° ΠΊΠΎΠΌΠ°Π½Π΄Π°: V+
3
ΠΠ·ΠΏΡΠ°ΡΠ΅Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°: 3
ΠΡΠΈΠ½ΡΡΠ° ΠΊΠΎΠΌΠ°Π½Π΄Π°: C+
4
ΠΠ·ΠΏΡΠ°ΡΠ΅Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°: 4
ΠΡΠΈΠ½ΡΡΠ° ΠΊΠΎΠΌΠ°Π½Π΄Π°: C-
0
$ΠΠΈΠΆΠ΄Π°ΠΌΠ΅, ΡΠ΅ ΡΠΎΠ½ΠΎΠ²Π΅ΡΠ΅ Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄ΠΈΡΠ΅ ΡΡΠΏΠ΅ΡΠ½ΠΎ ΡΠ΅ ΠΈΠ·ΠΏΡΠ°ΡΠ°Ρ ΠΈ Π΄Π΅ΡΠ΅ΠΊΡΠΎΡΡΡ Π³ΠΈ ΠΎΡΠΊΡΠΈΠ²Π°.
Π ΡΠ»Π΅Π΄Π²Π°ΡΠ°ΡΠ° ΡΡΠ°ΡΠΈΡ ΡΠ΅ ΡΠ΅ Π·Π°Π½ΠΈΠΌΠ°Π΅ΠΌ Ρ ΠΏΡΠ΅Π΄Π°Π²Π°Π½Π΅ Π½Π° Π·Π²ΡΠΊΠΎΠ² ΡΠΈΠ³Π½Π°Π» ΠΏΠΎ Ethernet ΠΌΡΠ΅ΠΆΠ° Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° RTP ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Π° ΠΈ Π²Π΅Π΄Π½Π°Π³Π° ΡΠ΅ Π³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠΈΠΌ Π² Π½Π°ΡΠΈΡ Π΄ΠΈΡΡΠ°Π½ΡΠΈΠΎΠ½Π΅Π½ ΠΊΠΎΠ½ΡΡΠΎΠ».
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: habr.com
