This file is indexed.

/usr/include/cmtspeech.h is in libcmtspeechdata-dev 2.1.1+git20160721~8efc468-2.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  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
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
/*
 * This file is part of libcmtspeechdata.
 *
 * Copyright (C) 2008,2009,2010 Nokia Corporation.
 *
 * Contact: Kai Vehmanen <kai.vehmanen@nokia.com>
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public License
 * as published by the Free Software Foundation; either version 2.1 of
 * the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
 * 02110-1301 USA
 */

/** @file cmtspeech.h
 *
 * CMT Speech Data protocol library.
 */

#ifndef INCLUDED_CMTSPEECH_H
#define INCLUDED_CMTSPEECH_H

#include <stdarg.h>
#include <stdbool.h>
#include <stdint.h>

#include <time.h>

#include <cmtspeech_msgs.h>
#include <cmtspeech_config.h>

/**
 * General list of TODO items:
 *
 * - relay SPC_FLAGS with downlink frames
 * - rename file to cmtspeechdata.h?
 */

/* Constants */
/* ------------------------------------------------*/

/**
 * Protocol states
 */
enum cmtspeech_state {
  CMTSPEECH_STATE_INVALID = 0,
  CMTSPEECH_STATE_DISCONNECTED,
  CMTSPEECH_STATE_CONNECTED,
  CMTSPEECH_STATE_ACTIVE_DL,
  CMTSPEECH_STATE_ACTIVE_DLUL,
  CMTSPEECH_STATE_TEST_RAMP_PING_ACTIVE
};

/**
 * Enumeration of state transitions
 */
enum cmtspeech_state_tr {
  CMTSPEECH_TR_INVALID = -1,
  CMTSPEECH_TR_0_NO_CHANGE = 0,
  CMTSPEECH_TR_1_CONNECTED = 1,
  CMTSPEECH_TR_2_DISCONNECTED = 2,
  CMTSPEECH_TR_3_DL_START = 3,
  CMTSPEECH_TR_4_DLUL_STOP = 4,
  CMTSPEECH_TR_5_PARAM_UPDATE = 5,
  CMTSPEECH_TR_6_TIMING_UPDATE = 6,
  CMTSPEECH_TR_7_TIMING_UPDATE = 7,
  CMTSPEECH_TR_10_RESET = 10,
  CMTSPEECH_TR_11_UL_STOP = 11,
  CMTSPEECH_TR_12_UL_START = 12
};

/**
 * A continuous stream of little-endian 16bit PCM
 * samples.
 */
#define CMTSPEECH_BUFFER_TYPE_PCM_S16_LE 0

/* bitmask set by cmtspeech_check_pending() */
#define CMTSPEECH_EVENT_CONTROL          (1 << 0) /**< control message available */
#define CMTSPEECH_EVENT_DL_DATA          (1 << 1) /**< DL frame available */
#define CMTSPEECH_EVENT_XRUN             (1 << 2) /**< DL overrun occured */

/* enum for 'frame_flags' field of cmtspeech_buffer_t */
#define CMTSPEECH_DATA_TYPE_ZERO         0x00
#define CMTSPEECH_DATA_TYPE_INVALID      0x01
#define CMTSPEECH_DATA_TYPE_VALID        0x02

/* bitmask for 'spc_flags' field of cmtspeech_buffer_t */
#define CMTSPEECH_SPC_FLAGS_SPEECH       (1 << 0)
#define CMTSPEECH_SPC_FLAGS_BFI          (1 << 1)
#define CMTSPEECH_SPC_FLAGS_ATTENUATE    (1 << 2)
#define CMTSPEECH_SPC_FLAGS_DEC_RESET    (1 << 3)
#define CMTSPEECH_SPC_FLAGS_MUTE         (1 << 4)
#define CMTSPEECH_SPC_FLAGS_PREV         (1 << 5)
#define CMTSPEECH_SPC_FLAGS_DTX_USED     (1 << 6)

/* Data structures
 * ----------------*/

/**
 * Frame data buffer descriptor.
 */
struct cmtspeech_buffer_s {
  int type;               /**< buffer type (CMTSPEECH_BUFFER_TYPE_*) */
  int count;              /**< octets of valid data (including header) */
  int pcount;             /**< octets of valid payload data */
  int size;               /**< octets of allocated space */
  int frame_flags;        /**< frame flags; enum CMTSPEECH_DATATYPE_* */
  unsigned int spc_flags; /**< speech codec flags for the frame;
			     for UL: always set to zero,
			     for DL: bitmask of CMTSPEECH_SPC_FLAGS_* */
  uint8_t *data;          /**< pointer to a buffer of 'size' octets */
  uint8_t *payload;       /**< pointer to frame payload */
  int index;              /**< library internal */
  int reserved[3];
};

/**
 * Typedef for cmtspeech_buffer_s
 */
typedef struct cmtspeech_buffer_s cmtspeech_buffer_t;

/**
 * Protocol state change event
 */
struct cmtspeech_event_s {

  int state;             /**< new state (CMTSPEECH_STATE_*) */
  int prev_state;        /**< previous state */

  int msg_type;          /**< type of the message that caused
			      the state change */

  int reserved;          /**< reserved */

  /**
   * A copy of the protocol message that caused
   * the state change (matching 'msg_type' field).
   */
  union {

    /* msg_type == CMTSPEECH_SSI_CONFIG_RESP: */
    struct {
      uint8_t layout;
      uint8_t version;       /**< deprecated in 1.6.1 */
      uint8_t result;
    } ssi_config_resp;

    /* msg_type == CMTSPEECH_SPEECH_CONFIG_REQ: */
    struct {
      uint8_t speech_data_stream;
      uint8_t call_user_connect_ind;
      uint8_t codec_info;    /**< deprecated in 1.5.3 */
      uint8_t cellular_info; /**< deprecated in 1.5.3 */
      uint8_t sample_rate;
      uint8_t data_format;
      bool layout_changed;   /**< if true, acquired dl/ul buffers
			          are invalid and need to be released */
    } speech_config_req;

    /* msg_type == CMTSPEECH_TIMING_CONFIG_NTF: */
    struct {
      uint16_t msec;
      uint16_t usec;
      struct timespec tstamp; /**< CLOCK_MONOTONIC timestamp when
			           the message was received by
			           HW driver */
    } timing_config_ntf;

    /* msg_type == CMTSPEECH_EVENT_RESET: */
    struct {
      int cmt_sent_req;  /**< whether CMT was the initiator */
    } reset_done;

    /* reserved / padding */
    struct {
      int reserved[4];
    } reserved;

  } msg;
};

/**
 * Typedef for cmtspeech_event_s
 */
typedef struct cmtspeech_event_s cmtspeech_event_t;

typedef void cmtspeech_t;

/* Interfaces: Core I/O
 * -------------------- */

/**
 * Initializes the libcmtspeechdata for use. Should be
 * called once when application is started.
 */
void cmtspeech_init(void);

/**
 * Opens the CMT Speech Data connection to the modem.
 *
 * @return Instance pointer is returned. On error,
 *         NULL is returned.
 */
cmtspeech_t* cmtspeech_open(void);

/**
 * Closes CMT Speech Data connection.
 *
 * @return Zero on success, a negative error code otherwise.
 */
int cmtspeech_close(cmtspeech_t *context);

/**
 * Returns a file descriptor that can be used to wait (with
 * poll()/select()) for events.
 *
 * When there is readable data, client should call
 * cmtspeech_check_events() function.
 *
 * @return a file descriptor
 */
int cmtspeech_descriptor(cmtspeech_t *context);

/**
 * Checks what events are available.
 *
 * Should be called when cmtspeech_descriptor() becomes readable.
 *
 * @param context self-pointer
 * @param flags bitmask of pending events (e.g.
 *        CMTSPEECH_EVENT_CONTROL, CMTSPEECH_DL_DATA_AVAIL, ...)
 *
 * @return 1 if events available, 0 if not, or a negative error code
 */
int cmtspeech_check_pending(cmtspeech_t *context, int *flags);

/**
 * Reads a control event and stores it to 'event'.
 *
 * This function should be called when cmtspeech_check_pending()
 * returns flag CMTSPEECH_EVENT_CONTROL.
 *
 * @return 0 on success
 */
int cmtspeech_read_event(cmtspeech_t *context, cmtspeech_event_t *event);

/* Interfaces: Event parsing
 * ------------------------- */

/**
 * Returns the matching state transition for for 'event'.
 *
 * In case either 'context' or 'event' is invalid,
 * CMTSPEECH_TR_INVALID is returned.
 *
 * This function is a helper function and its use is not
 * mandatory.
 *
 * @return enum cmtspeech_state_tr
 */
int cmtspeech_event_to_state_transition(const cmtspeech_t *context, const cmtspeech_event_t *event);

/* Interfaces: Runtime configuration
 * --------------------------------- */

/**
 * Sets preference for wideband mode
 *
 * If set to enabled, application is assumed to prefer sending and
 * receiving wideband (i.e. 16kHz sampling rate) speech frames. If
 * disabled, library assumes only 8kHz sampling rate is supported
 * and/or preferred.
 *
 * This setting will be passed to the modem upon session setup.
 * The final selection of sampling rate will however be done by
 * the modem. It is thus possible that modem will send
 * a CMTSPEECH_SPEECH_CONFIG_REQ event with sampling rate of 16kHz
 * even though application has disabled wideband support with
 * this method.
 *
 * The sampling rate used to interface with the modem does not
 * necessarily match the codec sampling rate used on the radio
 * interface. In other words the modem may resample the voice
 * frames to match the sampling rate used on modem<->libcmtspeechdata
 * link.
 *
 * By default, wideband mode is disabled after initial cmtspeech_open().
 *
 * This function can only be called when there is no active
 * session.
 *
 * @pre cmtspeech_is_ssi_connection_enabled(context) != true
 *
 * @return 0 on success
 */
int cmtspeech_set_wb_preference(cmtspeech_t *context, bool enabled);

/* Interfaces: State management
 * ---------------------------- */

/**
 * Returns the current protocol state.
 *
 * @return one of CMTSPEECH_STATE_*
 */
int cmtspeech_protocol_state(cmtspeech_t* context);

/**
 * Is SSI connection enabled?
 *
 * The connection is enabled when a succesful SSI_CONFIG_REQ/_RESP
 * transaction has completed.
 *
 * @return boolean answer
 */
bool cmtspeech_is_ssi_connection_enabled(cmtspeech_t *context);

/**
 * Is speech data stream active?
 *
 * The speech frame data stream is active when call parameters
 * have been delivered and either downlink, or both downlink and
 * uplink, frames are being sent.
 *
 * @return boolean answer
 */
bool cmtspeech_is_active(cmtspeech_t *context);

/**
 * Signals a change in call signaling server status.
 *
 * Note: this reflects the status of call signaling and is not
 * same as cmtspeech protocol state.
 *
 * @param state true call signaling instance has been started
 * @param state false call signaling instance has terminated
 */
int cmtspeech_state_change_call_status(cmtspeech_t *context, bool state);

/**
 * Signals a change in call connected status.
 *
 * Note: this reflects the status of call signaling and is not
 * same as cmtspeech protocol state.
 *
 * @param state true call has been connected
 * @param state false call has been disconnected
 */
int cmtspeech_state_change_call_connect(cmtspeech_t *context, bool state);

/**
 * Signals an error. Protocol state should be reseted.
 *
 * @param state true call has been connected
 * @param state false call has been disconnected
 *
 */
int cmtspeech_state_change_error(cmtspeech_t *context);

/* Interfaces: Buffer management
 * -------------------------------------- */

/**
 * Acquires the next uplink buffer slot. The buffer should be
 * filled with uplink data to be sent.
 *
 * Buffer can be acquired when data stream is active (i.e.
 * cmtspeech_is_active() is true). Note that it is possible
 * to acquire buffers already in CMTSPEECH_STATE_ACTIVE_DL
 * state.
 *
 * Following buffer properties are set by the library: 'type',
 * 'count', 'pcount', 'size', 'data' and 'payload'. Client should
 * copy payload contents to buffer pointed by 'payload', and
 * if needed, update the flags in 'frame_flags'. See documentation
 * of cmtspeech_buffer_t for more information about the struct
 * fields.
 *
 * @pre cmtspeech_is_active() == true
 *
 * @return 0 on success, other a negative error code:
 *    -EINVAL:  Invalid paramers or state, buffer not acquired.
 *    -ENOBUFS: No free uplink buffers, buffer not acquired.
 */
int cmtspeech_ul_buffer_acquire(cmtspeech_t *context, cmtspeech_buffer_t **buf);

/**
 * Releases a previously acquired uplink buffer slot back to the
 * library. The buffer will be sent immediately to the network, so
 * the caller must release the buffer in sync with network timing.
 * The timing parameters are delivered as events ('msg_type'
 * CMTSPEECH_TIMING_CONFIG_NTF).
 *
 * Client should update the following buffer properties: contents of
 * buffer pointed to by 'payload', and 'frame_flags'.
 *
 * @return 0 on success, otherwise a negative error code:
 *    -EBUSY:  Connection currently busy, frame not sent. Application
 *             should acquire a new buffer and retry sending later.
 *    -EINVAL: Invalid paramers or state, frame not sent.
 *    -EIO:    I/O error, frame not sent.
 *    -EPIPE:  Protocol state has changed since the buffer was
 *             acquired, frame not sent.
 */
int cmtspeech_ul_buffer_release(cmtspeech_t *context, cmtspeech_buffer_t *buf);

/**
 * Acquires the next downlink buffer slot. The buffer contains
 * the next available received frame of data.
 *
 * All the buffer properties are set according to the received
 * downlink frame.
 *
 * Note: Application must not write to the buffer memory,
 * i.e. 'buf->data' and 'buf->payload'.
 *
 * @return 0 on success, otherwise a negative error code:
 *    -EINVAL: Invalid paramers or state, buffer not acquired.
 *    -ENODATA: No downlink slot available, buffer not acquired.
 */
int cmtspeech_dl_buffer_acquire(cmtspeech_t *context, cmtspeech_buffer_t **buf);

/**
 * Releases a previously acquired downlink buffer slot back to the library.
 *
 * @return 0 on success, otherwise a negative error code
 *    -ENOENT: The buffer given as argument does not match any
 *             existing acquired buffer.
 *    -EINVAL: Invalid parameters or state.
 *    -EPIPE:  An underrun has occured because the buffer was released
 *             too late.
 */
int cmtspeech_dl_buffer_release(cmtspeech_t *context, cmtspeech_buffer_t *buf);

/**
 * Returns the codec sample rate for the buffer.
 *
 * The value reflects the original codec sample rate as it was
 * received from, or will be sent to, the radio interface. The value
 * may be different from value of cmtspeech_buffer_sample_rate(),
 * e.g. in the case where modem does decoding and resamples
 * the resulting PCM buffers.
 *
 * @return
 *   CMTSPEECH_SAMPLE_RATE_NONE: if information not available,
 *   CMTSPEECH_SAMPLE_RATE_8KHZ: 8kHz (narrow band),
 *   CMTSPEECH_SAMPLE_RATE_16KHZ: 16kHz (wide band)
 *
 * @see cmtspeech_dl_sample_rate().
 */
int cmtspeech_buffer_codec_sample_rate(cmtspeech_buffer_t *context);

/**
 * Returns the sample rate for the buffer.
 *
 * @return
 *   CMTSPEECH_SAMPLE_RATE_NONE: if information not available,
 *   CMTSPEECH_SAMPLE_RATE_8KHZ: 8kHz (narrow band),
 *   CMTSPEECH_SAMPLE_RATE_16KHZ: 16kHz (wide band)
 *
 * @see cmtspeech_dl_codec_sample_rate().
 */
int cmtspeech_buffer_sample_rate(cmtspeech_buffer_t *context);

/**
 * Returns the buffer descriptor pointing to raw downlink
 * frame at 'data'.
 *
 * @see cmtspeech_dl_buffer_release().
 */
cmtspeech_buffer_t *cmtspeech_dl_buffer_find_with_data(cmtspeech_t *context, uint8_t *data);

/**
 * Returns the buffer descriptor pointing to raw downlink
 * frame at 'data'.
 *
 * @see cmtspeech_dl_buffer_release().
 */
cmtspeech_buffer_t *cmtspeech_dl_buffer_find_with_data(cmtspeech_t *context, uint8_t *data);

/* Interfaces: Implementation version information
 * ----------------------------------------------------  */

/**
 * Returns the library implementation version as
 * a NULL-terminated string.
 */
const char* cmtspeech_version_str(void);

/**
 * Returns the implemented CMT Speech Data protocol version.
 *
 * Note that implementation may also provide backwards
 * compatibility for older versions.
 */
int cmtspeech_protocol_version(void);

/* Interfaces: Access to backend specific functionality
 * ----------------------------------------------------  */

/**
 * Returns a string identifying the library backend implementation.
 *
 * Backend name can be used to verify which set of custom messages
 * can be sent (@see cmtspeech_backend_name()).
 */
const char* cmtspeech_backend_name(cmtspeech_t* context);

/**
 * Passes a custom message to the library backend implementation.
 *
 * @param @type a typedef identifying which the message type (backend
 *        specific, @see cmtspeech_backend_name())
 * @param args variable number of arguments
 *
 * @return 0 on success, otherwise a negative error code
 */
int cmtspeech_backend_message(cmtspeech_t *self, int type, int args, ...);

/* Interfaces: Low level message handling
 * -------------------------------------- */

/**
 * Sends the NEW_TIMING_CONFIG_REQ message to CMT.
 *
 * @return 0 on success
 */
int cmtspeech_send_timing_request(cmtspeech_t *context);

/**
 * Sends the SSI_CONFIG_REQ message to CMT.
 *
 * @param state enabled or disabled
 *
 * @return 0 on success
 */
int cmtspeech_send_ssi_config_request(cmtspeech_t *context, bool active);

/* Interfaces: Test interface
 * -------------------------- */

/**
 * Initiates a test sequence where the peer is requested to send
 * back a test data frame.
 *
 * The response frame payload should contain a data ramp, starting
 * from value 'rampstart', and incremented by one in every octet.
 * The payload length should be 'ramplen' 32bit words.
 *
 * Note: this is a test interface that may not be supported by
 * all library backends.
 *
 * @return 0 on sucess, -1 on error
 */
int cmtspeech_test_data_ramp_req(cmtspeech_t *context, uint8_t rampstart, uint8_t ramplen);

/* Interfaces: Trace messages
 * -------------------------- */

typedef void (*cmtspeech_trace_handler_t)(int priority, const char *message, va_list args);

#define CMTSPEECH_TRACE_ERROR           0
#define CMTSPEECH_TRACE_INFO            3
#define CMTSPEECH_TRACE_STATE_CHANGE    4
#define CMTSPEECH_TRACE_IO              5
#define CMTSPEECH_TRACE_DEBUG           8
#define CMTSPEECH_TRACE_INTERNAL       16

/**
 * Enables or disables trace message of a given priority level.
 *
 * Note, some traces may be disabled at build time, and thus
 * some traces may be unavailable even if enabled with this
 * function.
 *
 * @param priority one of CMTSPEECH_TRACE_*
 * @param enabled if true, traces are allowed through
 */
void cmtspeech_trace_toggle(int priority, bool enabled);

/**
 * Sets the function to call when the library emits a trace
 * message.
 *
 * @param func handler function, or NULL to reset back to default
 *             handler
 */
int cmtspeech_set_trace_handler(cmtspeech_trace_handler_t func);

#endif /* INCLUDED_CMTSPEECH_H */