return SWITCH_STATUS_SUCCESS;
}
+/**
+ * Destroy the tone descriptor
+ *
+ * @param descriptor the descriptor to create
+ * @return void
+ */
+void tone_descriptor_destroy(tone_descriptor_t *descriptor)
+{
+ if (descriptor->spandsp_tone_descriptor) {
+ super_tone_rx_free_descriptor(descriptor->spandsp_tone_descriptor);
+ descriptor->spandsp_tone_descriptor = NULL;
+ }
+}
+
/**
* Add a tone to the tone descriptor
*
}
}
+/**
+ * Duplicate the tone descriptor
+ *
+ * @param descriptor the descriptor to use
+ * @param memory_pool the pool to use
+ * @return pointer to a copy of descriptor
+ */
+static tone_descriptor_t *tone_descriptor_dup(tone_descriptor_t *descriptor, switch_memory_pool_t *pool)
+{
+ tone_descriptor_t *desc = NULL;
+ int t = 0, s = 0, tone_count = 0;
+
+ if (descriptor && pool) {
+ if (tone_descriptor_create(&desc, descriptor->name, pool) != SWITCH_STATUS_SUCCESS) {
+ return NULL;
+ }
+
+ tone_count = descriptor->idx + 1;
+
+ for (t = 0; t < tone_count; t++) {
+ int tone_id = tone_descriptor_add_tone(desc, descriptor->tone_keys[t]);
+ if (-1 != tone_id) {
+ int step = descriptor->spandsp_tone_descriptor->tone_segs[tone_id];
+ for (s = 0; s < step; s++) {
+ super_tone_rx_segment_t segment = descriptor->spandsp_tone_descriptor->tone_list[tone_id][s];
+ int f1 = (segment.f1 == -1 ? 0 : descriptor->spandsp_tone_descriptor->pitches[segment.f1][0]);
+ int f2 = (segment.f2 == -1 ? 0 : descriptor->spandsp_tone_descriptor->pitches[segment.f2][0]);
+ int min = segment.min_duration / 8;
+ int max = (segment.max_duration == 0x7FFFFFFF ? 0 : segment.max_duration / 8);
+ tone_descriptor_add_tone_element(desc, tone_id, f1, f2, min, max);
+ }
+ } else {
+ tone_descriptor_destroy(desc);
+ desc = NULL;
+ break;
+ }
+ }
+ }
+
+ return desc;
+}
+
/**
* Allocate the tone detector
*
static switch_status_t tone_detector_create(switch_core_session_t *session, tone_detector_t **detector, tone_descriptor_t *descriptor)
{
tone_detector_t *ldetector = switch_core_session_alloc(session, sizeof(tone_detector_t));
- tone_descriptor_t *desc = switch_core_session_alloc(session, sizeof(tone_descriptor_t));
-
- memcpy(desc, descriptor, sizeof(tone_descriptor_t));
- ldetector->descriptor = desc;
+ ldetector->descriptor = tone_descriptor_dup(descriptor, switch_core_session_get_pool(session));
ldetector->debug = spandsp_globals.tonedebug;
ldetector->session = session;
*detector = ldetector;
super_tone_rx_free(detector->spandsp_detector);
detector->spandsp_detector = NULL;
}
+ if (detector->descriptor) {
+ tone_descriptor_destroy(detector->descriptor);
+ detector->descriptor = NULL;
+ }
}
}