ΠΠ°ΡΠ΅ΡΠΈΡΠ°Π»ΠΎΡ Π½Π° ΡΡΠ°ΡΠΈΡΠ°ΡΠ° Π΅ ΠΏΡΠ΅Π·Π΅ΠΌΠ΅Π½ ΠΎΠ΄ ΠΌΠΎΠ΅ΡΠΎ
Π’ΠΎΠ½ΡΠΊΠΈ Π΄Π΅ΡΠ΅ΠΊΡΠΎΡ
ΠΠΎ ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠΎΡ
ΠΠΎ ΡΡΠ°ΡΠΈΡΠ΅ Π²ΡΠ΅ΠΌΠΈΡΠ°, ΠΊΠΎΠ³Π° ΡΠ΅ΠΊΠΎΠ΅ ΡΠ΅ΠΌΠ΅ΡΡΡΠ²ΠΎ Π½Π΅ΠΌΠ°ΡΠ΅ ΡΠ΅Π»Π΅Π²ΠΈΠ·ΠΎΡ, Π° ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Π° ΠΎΠ΄ Π½ΠΈΠ² Π³ΠΈ ΠΌΠ΅Π½ΡΠ²Π°Π° ΠΊΠ°Π½Π°Π»ΠΈΡΠ΅ ΠΊΠΎΡΠΈΡΡΠ΅ΡΡΠΈ ΠΊΠ»Π΅ΡΡΠΈ, Π²ΠΎ ΠΏΡΠ΅Π³Π»Π΅Π΄ΠΈΡΠ΅ Π½Π° ΡΡΡΠ°Π½ΡΠΊΠΈΡΠ΅ ΡΠ΅Ρ Π½ΠΈΡΠΊΠΈ ΠΏΠ΅ΡΠ°ΡΠΈ ΡΠ΅ ΠΏΠΎΡΠ°Π²ΠΈΡΠ° ΠΈΠ½ΡΡΠΈΠ³Π°Π½ΡΠ½ΠΈ Π²Π΅ΡΡΠΈ Π΄Π΅ΠΊΠ° Π΅Π΄Π΅Π½ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π» Π½Π° ΡΠ΅Π»Π΅Π²ΠΈΠ·ΠΎΡ Π³ΠΈ ΠΎΠΏΡΠ΅ΠΌΠΈΠ» ΡΠ²ΠΎΠΈΡΠ΅ ΡΡΠ΅Π΄ΠΈ ΡΠΎ Π±Π΅Π·ΠΆΠΈΡΠ΅Π½ Π΄Π°Π»Π΅ΡΠΈΠ½ΡΠΊΠΈ ΡΠΏΡΠ°Π²ΡΠ²Π°Ρ. ΠΠ΄ Π΄Π΅ΡΠ°Π»ΠΈΡΠ΅ ΡΠ΅ Π·Π½Π°Π΅ΡΠ΅ Π΄Π΅ΠΊΠ° Π΄Π°Π»Π΅ΡΠΈΠ½ΡΠΊΠΈΠΎΡ ΡΠΏΡΠ°Π²ΡΠ²Π°Ρ ΡΠ°Π±ΠΎΡΠΈ Π±Π΅Π· Π±Π°ΡΠ΅ΡΠΈΠΈ Π±Π»Π°Π³ΠΎΠ΄Π°ΡΠ΅Π½ΠΈΠ΅ Π½Π° ΡΠΏΠΎΡΡΠ΅Π±Π°ΡΠ° Π½Π° Π½Π΅ΠΎΠ±ΠΈΡΠ΅Π½ ΠΏΡΠΈΡΡΠ°ΠΏ - Π΄Π°Π»Π΅ΡΠΈΠ½ΡΠΊΠΈΠΎΡ ΡΠΏΡΠ°Π²ΡΠ²Π°Ρ Π±ΠΈΠ» ΠΌΠ΅Ρ Π°Π½ΠΈΡΠΊΠΈ ΠΈ Π±ΠΈΠ» Ρ ΠΈΠ±ΡΠΈΠ΄ Π½Π° ΠΌΡΠ·ΠΈΡΠΊΠΈ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ - ΠΌΠ΅ΡΠ°Π»ΠΎΡΠΎΠ½ ΠΈ ΡΠ΅Π²ΠΎΠ»Π²Π΅Ρ. ΠΠΎ Π±Π°ΡΠ°Π±Π°Π½ΠΎΡ Π½Π° ΡΠ΅Π²ΠΎΠ»Π²Π΅ΡΠΎΡ ΠΈΠΌΠ°Π»ΠΎ ΠΌΠ΅ΡΠ°Π»Π½ΠΈ ΡΠΈΠ»ΠΈΠ½Π΄ΡΠΈ ΡΠΎ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ Π΄ΠΎΠ»ΠΆΠΈΠ½ΠΈ, Π° ΠΊΠΎΠ³Π° ΠΈΠ³Π»Π°ΡΠ° ΡΠ΄ΡΠΈΠ»Π° Π²ΠΎ Π΅Π΄Π΅Π½ ΠΎΠ΄ Π½ΠΈΠ², ΡΠΈΠ»ΠΈΠ½Π΄Π΅ΡΠΎΡ ΠΏΠΎΡΠ½Π°Π» Π΄Π° ΡΠ²ΠΎΠ½ΠΈ Π½Π° ΡΠ²ΠΎΡΠ° ΡΡΠ΅ΠΊΠ²Π΅Π½ΡΠΈΡΠ°. ΠΠ΅ΡΠΎΡΠ°ΡΠ½ΠΎ Π½Π° ΡΠ»ΡΡΠ°Π·Π²ΡΠΊ. ΠΠ»Π΅ΠΊΡΡΠΎΠ½ΠΈΠΊΠ°ΡΠ° Π²ΠΎ ΡΠ΅Π»Π΅Π²ΠΈΠ·ΠΎΡΠΎΡ Π³ΠΎ ΡΠ»ΡΡΠ½Π° ΠΎΠ²ΠΎΡ ΡΠΈΠ³Π½Π°Π» ΠΈ, ΠΎΡΠΊΠ°ΠΊΠΎ ΡΠ° ΠΎΠ΄ΡΠ΅Π΄ΠΈ Π½Π΅ΡΠ·ΠΈΠ½Π°ΡΠ° ΡΡΠ΅ΠΊΠ²Π΅Π½ΡΠΈΡΠ°, Π³ΠΎ ΠΈΠ·Π²ΡΡΠΈ ΡΠΎΠΎΠ΄Π²Π΅ΡΠ½ΠΎΡΠΎ Π΄Π΅ΡΡΡΠ²ΠΎ - Π²ΠΊΠ»ΡΡΠ΅ΡΠ΅ Π³ΠΎ ΠΊΠ°Π½Π°Π»ΠΎΡ, ΡΠΌΠ΅Π½Π΅ΡΠ΅ ΡΠ° ΡΠ°ΡΠΈΠ½Π°ΡΠ° Π½Π° Π·Π²ΡΠΊΠΎΡ, ΠΈΡΠΊΠ»ΡΡΠ΅ΡΠ΅ Π³ΠΎ ΡΠ΅Π»Π΅Π²ΠΈΠ·ΠΎΡΠΎΡ.
ΠΠ΅Π½Π΅Ρ ΡΠ΅ ΡΠ΅ ΠΎΠ±ΠΈΠ΄Π΅ΠΌΠ΅ Π΄Π° Π³ΠΎ ΡΠ΅ΠΊΠΎΠ½ΡΡΡΡΠΈΡΠ°ΠΌΠ΅ ΠΎΠ²ΠΎΡ ΡΠΈΡΡΠ΅ΠΌ Π·Π° ΠΏΡΠ΅Π½ΠΎΡ Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ, ΠΊΠΎΡΠΈΡΡΠ΅ΡΡΠΈ Π³ΠΎ Π½Π°ΡΠ΅ΡΠΎ Π·Π½Π°Π΅ΡΠ΅ Π·Π° ΠΌΠ΅Π΄ΠΈΡΠΌΡΠΊΠΈΠΎΡ ΡΡΡΠΈΠΌΠ΅Ρ.
ΠΠ° Π΄Π° ΡΠΈΠΌΡΠ»ΠΈΡΠ°ΠΌΠ΅ Π΄Π°Π»Π΅ΡΠΈΠ½ΡΠΊΠΈ ΡΠΏΡΠ°Π²ΡΠ²Π°Ρ, ΡΠ΅ Π³ΠΎ ΠΊΠΎΡΠΈΡΡΠΈΠΌΠ΅ ΡΠ΅ΠΊΡΡΠΎΡ Π½Π° Π½Π°ΡΠΈΠΎΡ ΠΏΡΠΈΠΌΠ΅Ρ Π·Π° Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡ Π½Π° ΡΠΎΠ½ΠΎΠ²ΠΈ. ΠΠ° Π½Π΅Π³ΠΎ ΡΠ΅ Π΄ΠΎΠ΄Π°Π΄Π΅ΠΌΠ΅ ΠΊΠΎΠ½ΡΡΠΎΠ»Π° Π½Π° ΡΡΠ΅ΠΊΠ²Π΅Π½ΡΠΈΡΠ°ΡΠ° Π½Π° Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡΠΎΡ ΠΎΠ΄ ΠΏΡΠΈΡΠΈΡΠΊΠ°ΡΠ΅ Π½Π° ΠΊΠΎΠΏΡΠΈΡΠ°ΡΠ° ΠΈ ΠΏΡΠΈΠ΅ΠΌΠ½ΠΈΠΊ ΡΠΎ Π΄Π΅ΠΊΠΎΠ΄Π΅Ρ ΠΊΠΎΡ ΡΠ΅ Π³ΠΈ Π΅ΠΌΠΈΡΡΠ²Π° ΠΏΡΠΈΠΌΠ΅Π½ΠΈΡΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ Π½Π° ΠΊΠΎΠ½Π·ΠΎΠ»Π°ΡΠ°. ΠΠΎ ΠΏΡΠΎΠΌΠ΅Π½Π°ΡΠ°, Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡΠΎΡ ΡΡΠ΅Π±Π° Π΄Π° ΠΏΡΠΎΠΈΠ·Π²Π΅Π΄Π΅ ΡΠΎΠ½ΠΎΠ²ΠΈ ΠΎΠ΄ 6 ΡΡΠ΅ΠΊΠ²Π΅Π½ΡΠΈΠΈ, ΡΠΎ ΠΊΠΎΠΈ ΡΠ΅ ΠΊΠΎΠ΄ΠΈΡΠ°ΠΌΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ Π·Π° Π·Π³ΠΎΠ»Π΅ΠΌΡΠ²Π°ΡΠ΅/Π½Π°ΠΌΠ°Π»ΡΠ²Π°ΡΠ΅ Π½Π° ΡΠ°ΡΠΈΠ½Π°ΡΠ° Π½Π° Π·Π²ΡΠΊΠΎΡ, ΠΏΡΠΎΠΌΠ΅Π½Π° Π½Π° ΠΊΠ°Π½Π°Π»ΠΎΡ, Π²ΠΊΠ»ΡΡΡΠ²Π°ΡΠ΅/ΠΈΡΠΊΠ»ΡΡΡΠ²Π°ΡΠ΅ Π½Π° ΡΠ΅Π»Π΅Π²ΠΈΠ·ΠΎΡΠΎΡ. ΠΠ° Π΄Π° Π³ΠΎ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°ΡΠ΅ Π΄Π΅ΡΠ΅ΠΊΡΠΎΡΠΎΡ, ΡΠ΅ ΠΊΠΎΡΠΈΡΡΠΈ ΡΠ»Π΅Π΄Π½Π°Π²Π° ΡΡΡΡΠΊΡΡΡΠ°:
struct _MSToneDetectorDef{
char tone_name[8];
int frequency; /**<Expected frequency of the tone*/
int min_duration; /**<Min duration of the tone in milliseconds */
float min_amplitude; /**<Minimum amplitude of the tone, 1.0 corresponding to the normalized 0dbm level */
};
typedef 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) Unknown parameters 0
ALSA lib control.c:954:(snd_ctl_open_noupdate) Invalid CTL default:0
ortp-warning-Could not attach mixer to card: Invalid argument
ALSA lib conf.c:4738:(snd_config_expand) Unknown parameters 0
ALSA lib pcm.c:2266:(snd_pcm_open_noupdate) Unknown PCM default:0
ALSA lib conf.c:4738:(snd_config_expand) Unknown parameters 0
ALSA lib pcm.c:2266:(snd_pcm_open_noupdate) Unknown PCM default:0
ortp-warning-Strange, sound card Intel 82801AA-ICH does not seems to be capable of anything, retrying with plughw...
ΠΠ°ΠΆΠΌΠΈΡΠ΅ ΠΊΠ»Π°Π²ΠΈΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ, Π·Π°ΡΠ΅ΠΌ Π²Π²ΠΎΠ΄.
ΠΠ»Ρ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π²Π²Π΅Π΄ΠΈΡΠ΅ 0.
ortp-warning-alsa_set_params: periodsize:256 Using 256
ortp-warning-alsa_set_params: period:8 Using 8
ΠΡΠΈΡΠΈΡΠ½Π΅ΡΠ΅ ΠΊΠΎΠΈ Π±ΠΈΠ»ΠΎ ΠΊΠΎΠΏΡΠΈΡΠ° ΠΎΠ΄ β1β Π΄ΠΎ β6β, ΠΏΠΎΡΠ²ΡΠ΄ΡΠ²Π°ΡΡΠΈ ΡΠΎ ΠΊΠΎΠΏΡΠ΅ΡΠΎ βEnterβ, ΡΡΠ΅Π±Π° Π΄Π° Π΄ΠΎΠ±ΠΈΠ΅ΡΠ΅ Π½Π΅ΡΡΠΎ ΠΊΠ°ΠΊΠΎ ΠΎΠ²Π°Π° Π»ΠΈΡΡΠ°:
2
ΠΡΠΏΡΠ°Π²Π»Π΅Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°: 2
ΠΡΠΈΠ½ΡΡΠ° ΠΊΠΎΠΌΠ°Π½Π΄Π°: V-
1
ΠΡΠΏΡΠ°Π²Π»Π΅Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°: 1
ΠΡΠΈΠ½ΡΡΠ° ΠΊΠΎΠΌΠ°Π½Π΄Π°: V+
3
ΠΡΠΏΡΠ°Π²Π»Π΅Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°: 3
ΠΡΠΈΠ½ΡΡΠ° ΠΊΠΎΠΌΠ°Π½Π΄Π°: C+
4
ΠΡΠΏΡΠ°Π²Π»Π΅Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°: 4
ΠΡΠΈΠ½ΡΡΠ° ΠΊΠΎΠΌΠ°Π½Π΄Π°: C-
0
$
ΠΠ»Π΅Π΄Π°ΠΌΠ΅ Π΄Π΅ΠΊΠ° ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΈΡΠ΅ ΡΠΎΠ½ΠΎΠ²ΠΈ ΡΠ΅ ΡΡΠΏΠ΅ΡΠ½ΠΎ ΠΈΡΠΏΡΠ°ΡΠ΅Π½ΠΈ ΠΈ Π΄Π΅ΡΠ΅ΠΊΡΠΎΡΠΎΡ Π³ΠΈ Π΄Π΅ΡΠ΅ΠΊΡΠΈΡΠ°.
ΠΠΎ ΡΠ»Π΅Π΄Π½Π°ΡΠ° ΡΡΠ°ΡΠΈΡΠ° ΡΠ΅ ΡΠ΅ ΡΠ²ΡΡΠΈΠΌΠ΅ ΠΊΠΎΠ½ ΠΏΡΠ΅Π½ΠΎΡ Π½Π° Π°ΡΠ΄ΠΈΠΎ ΡΠΈΠ³Π½Π°Π» ΠΏΡΠ΅ΠΊΡ Π΅ΡΠ΅ΡΠ½Π΅Ρ ΠΌΡΠ΅ΠΆΠ° ΡΠΎ ΠΏΠΎΠΌΠΎΡ Π½Π° ΠΏΡΠΎΡΠΎΠΊΠΎΠ»ΠΎΡ RTP ΠΈ Π²Π΅Π΄Π½Π°Ρ ΡΠ΅ Π³ΠΎ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΠΌΠ΅ Π½Π° Π½Π°ΡΠΈΠΎΡ Π΄Π°Π»Π΅ΡΠΈΠ½ΡΠΊΠΈ ΡΠΏΡΠ°Π²ΡΠ²Π°Ρ.
ΠΠ·Π²ΠΎΡ: www.habr.com