ΠΠ°ΡΠ΅ΡΠΈΠ°Π»ΡΡ Π½Π° ΡΡΠ°ΡΠΈΡΡΠ° Π΅ Π²Π·Π΅Ρ ΠΎΡ ΠΌΠΎΡ .
ΠΡΠΊΡΠΈΠ²Π°ΡΠ΅Π» Π½Π° ΡΠΎΠ½Π°Π»Π΅Π½ ΡΠΈΠ³Π½Π°Π»
Π ΠΏΡΠ΅Π΄Ρ ΠΎΠ΄Π½Π°ΡΠ° Π‘ΡΠ·Π΄Π°Π΄ΠΎΡ ΠΌΠ΅ ΠΈΠ·ΠΌΠ΅ΡΠΈΡΠ΅Π» Π½Π° Π½ΠΈΠ²ΠΎΡΠΎ Π½Π° ΡΠΈΠ³Π½Π°Π»Π°. Π Π½Π΅Π³ΠΎ ΡΠ΅ Π½Π°ΡΡΠΈΠΌ ΠΊΠ°ΠΊ Π΄Π° ΠΎΡΠΊΡΠΈΠ²Π°ΠΌΠ΅ ΡΠΎΠ½Π°Π»Π΅Π½ ΡΠΈΠ³Π½Π°Π».
![]()
Π ΠΌΠΈΠ½Π°Π»ΠΎΡΠΎ, ΠΊΠΎΠ³Π°ΡΠΎ Π½Π΅ Π²ΡΡΠΊΠΎ ΡΠ΅ΠΌΠ΅ΠΉΡΡΠ²ΠΎ ΡΠ°Π·ΠΏΠΎΠ»Π°Π³Π°ΡΠ΅ Ρ ΡΠ΅Π»Π΅Π²ΠΈΠ·ΠΎΡ, Π° ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Π°ΡΠ° ΠΎΡ ΡΡΡ ΡΠΌΠ΅Π½ΡΡ Π° ΠΊΠ°Π½Π°Π»ΠΈΡΠ΅ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° ΠΊΠ»Π΅ΡΠΈ, Π² ΡΠ΅ΡΠ΅Π½Π·ΠΈΠΈΡΠ΅ Π½Π° ΡΡΠΆΠ΄Π°ΡΠ° ΡΠ΅Ρ Π½ΠΈΡΠ΅ΡΠΊΠ° ΠΏΡΠ΅ΡΠ° ΡΠ΅ ΠΏΠΎΡΠ²ΠΈ ΠΈΠ½ΡΡΠΈΠ³ΡΠ²Π°ΡΠ° Π½ΠΎΠ²ΠΈΠ½Π°, ΡΠ΅ Π΅Π΄ΠΈΠ½ ΠΎΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΠΈΡΠ΅ Π½Π° ΡΠ΅Π»Π΅Π²ΠΈΠ·ΠΎΡΠΈ Π΅ ΠΎΡΠΈΠ³ΡΡΠΈΠ» Π½Π° ΡΠ²ΠΎΠΈΡΠ΅ ΡΡΡΡΠΎΠΉΡΡΠ²Π° Π΄ΠΈΡΡΠ°Π½ΡΠΈΠΎΠ½Π½ΠΎ Π±Π΅Π·ΠΆΠΈΡΠ½ΠΎ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅. ΠΡ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎΡΡΠΈΡΠ΅ Π±Π΅ΡΠ΅ ΠΈΠ·Π²Π΅ΡΡΠ½ΠΎ, ΡΠ΅ Π΄ΠΈΡΡΠ°Π½ΡΠΈΠΎΠ½Π½ΠΎΡΠΎ ΡΠ°Π±ΠΎΡΠΈ Π±Π΅Π· Π±Π°ΡΠ΅ΡΠΈΠΈ Π±Π»Π°Π³ΠΎΠ΄Π°ΡΠ΅Π½ΠΈΠ΅ Π½Π° Π½Π΅ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΡ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ β ΡΠΎ Π±Π΅ΡΠ΅ ΠΌΠ΅Ρ Π°Π½ΠΈΡΠ½ΠΎ ΠΈ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ²Π°ΡΠ΅ Ρ ΠΈΠ±ΡΠΈΠ΄ Π½Π° ΠΌΡΠ·ΠΈΠΊΠ°Π»Π΅Π½ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ β ΠΌΠ΅ΡΠ°Π»ΠΎΡΠΎΠ½ ΠΈ ΡΠ΅Π²ΠΎΠ»Π²Π΅Ρ. Π Π±Π°ΡΠ°Π±Π°Π½Π° Π½Π° ΡΠ΅Π²ΠΎΠ»Π²Π΅ΡΠ° ΠΈΠΌΠ°ΡΠ΅ ΠΌΠ΅ΡΠ°Π»Π½ΠΈ ΡΠΈΠ»ΠΈΠ½Π΄ΡΠΈ, ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΠΏΠΎ Π΄ΡΠ»ΠΆΠΈΠ½Π°, ΠΈ ΠΊΠΎΠ³Π°ΡΠΎ ΠΊΠ°ΠΏΡΡΠ»Π°ΡΠ° ΡΠ΄Π°ΡΠ΅ΡΠ΅ Π΅Π΄ΠΈΠ½ ΠΎΡ ΡΡΡ , ΡΠΈΠ»ΠΈΠ½Π΄ΡΡΡΡ Π·Π°ΠΏΠΎΡΠ²Π°ΡΠ΅ Π΄Π° Π·Π²ΡΡΠΈ Π½Π° ΡΠΎΠ±ΡΡΠ²Π΅Π½Π°ΡΠ° ΡΠΈ ΡΠ΅ΡΡΠΎΡΠ°. ΠΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π° ΡΠ΅, ΡΠ΅ Π½Π° ΡΠ»ΡΡΠ°Π·Π²ΡΠΊ. ΠΠ»Π΅ΠΊΡΡΠΎΠ½ΠΈΠΊΠ°ΡΠ° Π² ΡΠ΅Π»Π΅Π²ΠΈΠ·ΠΎΡΠ° ΡΡΠ²Π°ΡΠ΅ ΡΠΎΠ·ΠΈ ΡΠΈΠ³Π½Π°Π» ΠΈ, ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠΉΠΊΠΈ Π½Π΅Π³ΠΎΠ²Π°ΡΠ° ΡΠ΅ΡΡΠΎΡΠ°, ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π°ΡΠ΅ ΡΡΠΎΡΠ²Π΅ΡΠ½ΠΎΡΠΎ Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ β ΡΠΌΠ΅Π½ΡΡΠ΅ ΠΊΠ°Π½Π°Π»Π°, ΡΠ΅Π³ΡΠ»ΠΈΡΠ°ΡΠ΅ Π·Π²ΡΠΊΠ° ΠΈΠ»ΠΈ ΠΈΠ·ΠΊΠ»ΡΡΠ²Π°ΡΠ΅ ΡΠ΅Π»Π΅Π²ΠΈΠ·ΠΎΡΠ°.
ΠΠ½Π΅Ρ ΡΠ΅ ΠΎΠΏΠΈΡΠ°ΠΌΠ΅ Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΠΌ ΡΠ΅ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΡ Π½Π° ΡΠ°Π·ΠΈ ΡΠΈΡΡΠ΅ΠΌΠ° Π·Π° ΠΏΡΠ΅Π΄Π°Π²Π°Π½Π΅ Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ, ΠΊΠ°ΡΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ Π½Π°ΡΠΈΡΠ΅ Π·Π½Π°Π½ΠΈΡ Π·Π° ΠΌΠ΅Π΄ΠΈΠ°ΡΡΡΠΈΠΌΠ΅ΡΠ°.
ΠΠ° Π΄Π° ΡΠΈΠΌΡΠ»ΠΈΡΠ°ΠΌΠ΅ Π΄ΠΈΡΡΠ°Π½ΡΠΈΠΎΠ½Π½ΠΎΡΠΎ, ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ ΡΠ΅ΠΊΡΡΠ° Π½Π° Π½Π°ΡΠΈΡ ΠΏΡΠΈΠΌΠ΅Ρ Π·Π° ΡΠΎΠ½Π°Π»Π΅Π½ Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡ. Π©Π΅ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° ΡΠ΅ΡΡΠΎΡΠ°ΡΠ° Π½Π° Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡΠ° ΠΎΡ Π½Π°ΡΠΈΡΠΊΠ°Π½ΠΈΡ Π½Π° ΠΊΠ»Π°Π²ΠΈΠ°ΡΡΡΠ°ΡΠ° ΠΈ ΠΏΡΠΈΠ΅ΠΌΠ½ΠΈΠΊ Ρ Π΄Π΅ΠΊΠΎΠ΄Π΅Ρ, ΠΊΠΎΠΉΡΠΎ ΡΠ΅ ΠΈΠ·Π²Π΅ΠΆΠ΄Π° ΠΏΡΠΈΠ΅ΡΠΈΡΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ Π² ΠΊΠΎΠ½Π·ΠΎΠ»Π°ΡΠ°. Π‘Π»Π΅Π΄ ΠΏΡΠΎΠΌΠ΅Π½ΠΈΡΠ΅, Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡΡΡ ΡΡΡΠ±Π²Π° Π΄Π° ΠΈΠ·Π΄Π°Π²Π° ΡΠΎΠ½Π°Π»Π½ΠΈ ΡΠΈΠ³Π½Π°Π»ΠΈ Ρ 6 ΡΠ΅ΡΡΠΎΡΠΈ, Ρ ΠΊΠΎΠΈΡΠΎ ΡΠ΅ ΠΊΠΎΠ΄ΠΈΡΠ° ΠΊΠΎΠΌΠ°Π½Π΄ΠΈΡΠ΅ Π·Π° ΡΠ²Π΅Π»ΠΈΡΠ°Π²Π°Π½Π΅/Π½Π°ΠΌΠ°Π»ΡΠ²Π°Π½Π΅ Π½Π° Π·Π²ΡΠΊΠ°, ΡΠΌΡΠ½Π° Π½Π° ΠΊΠ°Π½Π°Π»Π°, Π²ΠΊΠ»ΡΡΠ²Π°Π½Π΅/ΠΈΠ·ΠΊΠ»ΡΡΠ²Π°Π½Π΅ Π½Π° ΡΠ΅Π»Π΅Π²ΠΈΠ·ΠΎΡΠ°. ΠΠ° Π½Π°ΡΡΡΠΎΠΉΠΊΠ° Π½Π° Π΄Π΅ΡΠ΅ΠΊΡΠΎΡΠ° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΡΡΡΡΠΊΡΡΡΠ°ΡΠ°:
struct _MSToneDetectorDef{
char tone_name[8];
int frequency;
int min_duration;
float min_amplitude;
};
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...
ΠΠ°ΡΠΈΡΠ½Π΅ΡΠ΅ ΠΊΠ»Π°Π²ΠΈΡΠ° Π·Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°, ΡΠ»Π΅Π΄ ΡΠΎΠ²Π° Enter.
ΠΠ° Π΄Π° Π·Π°Π²ΡΡΡΠΈΡΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ°, Π²ΡΠ²Π΅Π΄Π΅ΡΠ΅ 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
$ΠΠΈΠΆΠ΄Π°ΠΌΠ΅, ΡΠ΅ ΡΠΎΠ½ΠΎΠ²Π΅ΡΠ΅ Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄ΠΈΡΠ΅ ΡΡΠΏΠ΅ΡΠ½ΠΎ ΡΠ΅ ΠΈΠ·ΠΏΡΠ°ΡΠ°Ρ ΠΈ Π΄Π΅ΡΠ΅ΠΊΡΠΎΡΡΡ Π³ΠΈ ΠΎΡΠΊΡΠΈΠ²Π°.
Π ΡΠ»Π΅Π΄Π²Π°ΡΠ°ΡΠ° ΡΡΠ°ΡΠΈΡ ΡΠ΅ ΡΠ΅ ΠΎΠ±ΡΡΠ½Π΅ΠΌ ΠΊΡΠΌ ΠΏΡΠ΅Π΄Π°Π²Π°Π½Π΅ΡΠΎ Π½Π° Π·Π²ΡΠΊΠΎΠ² ΡΠΈΠ³Π½Π°Π» ΠΏΠΎ ΠΌΡΠ΅ΠΆΠ° Ethernet Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° RTP-ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Π° ΠΈ ΡΠ΅ Π³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠΈΠΌ Π² Π½Π°ΡΠ΅ΡΠΎ Π΄ΠΈΡΡΠ°Π½ΡΠΈΠΎΠ½Π½ΠΎ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅.
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: habr.com
