blob: 02ff702441b7f738885a7f8c0bd2e2ce2cef53f8 [file] [log] [blame]
Benny Prijono6107a002006-03-17 18:01:27 +00001
Benny Prijonoe7483e52006-04-06 21:08:35 +00002#include <stdlib.h> /* strtol() */
Benny Prijono6107a002006-03-17 18:01:27 +00003
Benny Prijonobc797312006-03-24 20:44:27 +00004/* Util to display the error message for the specified error code */
Benny Prijono6107a002006-03-17 18:01:27 +00005static int app_perror( const char *sender, const char *title,
6 pj_status_t status)
7{
8 char errmsg[PJ_ERR_MSG_SIZE];
9
10 pj_strerror(status, errmsg, sizeof(errmsg));
11
Benny Prijonobc797312006-03-24 20:44:27 +000012 PJ_LOG(3,(sender, "%s: %s [code=%d]", title, errmsg, status));
Benny Prijono6107a002006-03-17 18:01:27 +000013 return 1;
14}
15
Benny Prijonobc797312006-03-24 20:44:27 +000016
17
18/* Constants */
19#define CLOCK_RATE 44100
20#define NSAMPLES (CLOCK_RATE * 20 / 1000)
21#define NCHANNELS 1
22#define NBITS 16
23
Benny Prijono6107a002006-03-17 18:01:27 +000024/*
Benny Prijonobc797312006-03-24 20:44:27 +000025 * Common sound options.
Benny Prijono6107a002006-03-17 18:01:27 +000026 */
Benny Prijonobc797312006-03-24 20:44:27 +000027#define SND_USAGE \
28" -d, --dev=NUM Sound device use device id NUM (default=-1) \n"\
29" -r, --rate=HZ Set clock rate in samples per sec (default=44100)\n"\
30" -c, --channel=NUM Set # of channels (default=1 for mono). \n"\
31" -f, --frame=NUM Set # of samples per frame (default equival 20ms)\n"\
32" -b, --bit=NUM Set # of bits per sample (default=16) \n"
33
34
35/*
36 * This utility function parses the command line and look for
37 * common sound options.
38 */
Benny Prijonobf13fee2006-04-20 11:13:32 +000039pj_status_t get_snd_options(const char *app_name,
40 int argc,
41 char *argv[],
42 int *dev_id,
43 int *clock_rate,
44 int *channel_count,
45 int *samples_per_frame,
46 int *bits_per_sample)
Benny Prijono6107a002006-03-17 18:01:27 +000047{
Benny Prijonobc797312006-03-24 20:44:27 +000048 struct pj_getopt_option long_options[] = {
49 { "dev", 1, 0, 'd' },
50 { "rate", 1, 0, 'r' },
51 { "channel", 1, 0, 'c' },
52 { "frame", 1, 0, 'f' },
53 { "bit", 1, 0, 'b' },
54 { NULL, 0, 0, 0 },
55 };
56 int c;
57 int option_index;
58 long val;
59 char *err;
Benny Prijono6107a002006-03-17 18:01:27 +000060
Benny Prijonobc797312006-03-24 20:44:27 +000061 *samples_per_frame = 0;
Benny Prijono6107a002006-03-17 18:01:27 +000062
Benny Prijonobc797312006-03-24 20:44:27 +000063 pj_optind = 0;
64 while((c=pj_getopt_long(argc,argv, "d:r:c:f:b:",
65 long_options, &option_index))!=-1)
Benny Prijono6107a002006-03-17 18:01:27 +000066 {
Benny Prijono6107a002006-03-17 18:01:27 +000067
Benny Prijonobc797312006-03-24 20:44:27 +000068 switch (c) {
69 case 'd':
70 /* device */
71 val = strtol(pj_optarg, &err, 10);
72 if (*err) {
73 PJ_LOG(3,(app_name, "Error: invalid value for device id"));
74 return PJ_EINVAL;
75 }
76 *dev_id = val;
77 break;
Benny Prijono6107a002006-03-17 18:01:27 +000078
Benny Prijonobc797312006-03-24 20:44:27 +000079 case 'r':
80 /* rate */
81 val = strtol(pj_optarg, &err, 10);
82 if (*err) {
83 PJ_LOG(3,(app_name, "Error: invalid value for clock rate"));
84 return PJ_EINVAL;
85 }
86 *clock_rate = val;
87 break;
Benny Prijono6107a002006-03-17 18:01:27 +000088
Benny Prijonobc797312006-03-24 20:44:27 +000089 case 'c':
90 /* channel count */
91 val = strtol(pj_optarg, &err, 10);
92 if (*err) {
93 PJ_LOG(3,(app_name, "Error: invalid channel count"));
94 return PJ_EINVAL;
95 }
96 *channel_count = val;
97 break;
Benny Prijono6107a002006-03-17 18:01:27 +000098
Benny Prijonobc797312006-03-24 20:44:27 +000099 case 'f':
100 /* frame count/samples per frame */
101 val = strtol(pj_optarg, &err, 10);
102 if (*err) {
103 PJ_LOG(3,(app_name, "Error: invalid samples per frame"));
104 return PJ_EINVAL;
105 }
106 *samples_per_frame = val;
107 break;
108
109 case 'b':
110 /* bit per sample */
111 val = strtol(pj_optarg, &err, 10);
112 if (*err) {
113 PJ_LOG(3,(app_name, "Error: invalid samples bits per sample"));
114 return PJ_EINVAL;
115 }
116 *bits_per_sample = val;
117 break;
118
119 default:
120 /* Unknown options */
121 PJ_LOG(3,(app_name, "Error: unknown options '%c'", pj_optopt));
122 return PJ_EINVAL;
Benny Prijono6107a002006-03-17 18:01:27 +0000123 }
Benny Prijonobc797312006-03-24 20:44:27 +0000124
Benny Prijono6107a002006-03-17 18:01:27 +0000125 }
126
Benny Prijonobc797312006-03-24 20:44:27 +0000127 if (*samples_per_frame == 0) {
128 *samples_per_frame = *clock_rate * *channel_count * 20 / 1000;
129 }
130
131 return 0;
Benny Prijono6107a002006-03-17 18:01:27 +0000132}
133
Benny Prijonobc797312006-03-24 20:44:27 +0000134
135/* Dump memory pool usage. */
Benny Prijonobf13fee2006-04-20 11:13:32 +0000136void dump_pool_usage( const char *app_name, pj_caching_pool *cp )
Benny Prijono6107a002006-03-17 18:01:27 +0000137{
Benny Prijono46ecff82006-03-30 16:46:36 +0000138#if !defined(PJ_HAS_POOL_ALT_API) || PJ_HAS_POOL_ALT_API==0
Benny Prijonobc797312006-03-24 20:44:27 +0000139 pj_pool_t *p;
140 unsigned total_alloc = 0;
141 unsigned total_used = 0;
Benny Prijono6107a002006-03-17 18:01:27 +0000142
Benny Prijonobc797312006-03-24 20:44:27 +0000143 /* Accumulate memory usage in active list. */
144 p = cp->used_list.next;
145 while (p != (pj_pool_t*) &cp->used_list) {
146 total_alloc += pj_pool_get_capacity(p);
147 total_used += pj_pool_get_used_size(p);
148 p = p->next;
Benny Prijono6107a002006-03-17 18:01:27 +0000149 }
150
Benny Prijonobc797312006-03-24 20:44:27 +0000151 PJ_LOG(3, (app_name, "Total pool memory allocated=%d KB, used=%d KB",
152 total_alloc / 1000,
153 total_used / 1000));
Benny Prijono46ecff82006-03-30 16:46:36 +0000154#endif
Benny Prijono6107a002006-03-17 18:01:27 +0000155}