diff options
| author | David Schleef <ds@schleef.org> | 2004-03-23 04:42:57 +0000 | 
|---|---|---|
| committer | David Schleef <ds@schleef.org> | 2004-03-23 04:42:57 +0000 | 
| commit | fa587e1ce5133f59ad0eed1aeb2836c5d232f11b (patch) | |
| tree | 2132f9bb72fad988fc92e48e0cd92fcc2ad480b7 | |
| parent | 3cd8eca7f3ae6762de6218dda747ef63aa988115 (diff) | |
minor updates to last checkin
Original commit message from CVS:
minor updates to last checkin
| -rw-r--r-- | sys/oss/Makefile.am | 2 | ||||
| -rw-r--r-- | sys/oss/oss_probe.c | 156 | 
2 files changed, 81 insertions, 77 deletions
diff --git a/sys/oss/Makefile.am b/sys/oss/Makefile.am index 5480bb7e..0f1d17ed 100644 --- a/sys/oss/Makefile.am +++ b/sys/oss/Makefile.am @@ -18,6 +18,6 @@ noinst_HEADERS = gstosssink.h	\  noinst_PROGRAMS = oss_probe  oss_probe_SOURCES = oss_probe.c -oss_probe_CFLAGS = $(GLIB_CFLAGS) +oss_probe_CFLAGS = $(GST_CFLAGS)  oss_probe_LDADD = $(GLIB_LIBS) diff --git a/sys/oss/oss_probe.c b/sys/oss/oss_probe.c index dca158a9..741bb4c7 100644 --- a/sys/oss/oss_probe.c +++ b/sys/oss/oss_probe.c @@ -14,6 +14,8 @@ struct _Probe    int format;    int n_channels;    GArray *rates; +  int min; +  int max;  };  typedef struct _Range Range; @@ -25,15 +27,14 @@ struct _Range  static gboolean probe_check (Probe * probe);  static int check_rate (Probe * probe, int irate); -static GList *add_range (GList * list, int min, int max); +static void add_range (GQueue * queue, int min, int max);  static void add_rate (GArray * array, int rate); +static int int_compare (gconstpointer a, gconstpointer b);  int  main (int argc, char *argv[])  {    int fd; -  int n; -  int *rates;    int i;    Probe *probe; @@ -49,10 +50,14 @@ main (int argc, char *argv[])    probe->n_channels = 2;    probe_check (probe); +  g_array_sort (probe->rates, int_compare);    for (i = 0; i < probe->rates->len; i++) {      g_print ("%d\n", g_array_index (probe->rates, int, i));    } +  g_array_free (probe->rates, TRUE); +  g_free (probe); +  #if 0    probe = g_new0 (Probe, 1);    probe->fd = fd; @@ -91,64 +96,56 @@ main (int argc, char *argv[])  static gboolean  probe_check (Probe * probe)  { -  GList *item;    Range *range; -  GList *new_ranges; -  GList *ranges; -  int i; -  int min, max; +  GQueue *ranges;    int exact_rates = 0;    gboolean checking_exact_rates = TRUE;    int n_checks = 0; +  gboolean result = TRUE; + +  ranges = g_queue_new ();    probe->rates = g_array_new (FALSE, FALSE, sizeof (int)); -  min = check_rate (probe, 1000); -  add_rate (probe->rates, min); +  probe->min = check_rate (probe, 1000);    n_checks++; -  max = check_rate (probe, 100000); -  add_rate (probe->rates, max); +  probe->max = check_rate (probe, 100000);    n_checks++; -  ranges = add_range (NULL, min + 1, max - 1); - -  for (i = 0; i < 20; i++) { -    new_ranges = NULL; - -    if (ranges == NULL) { -      g_print ("no more ranges, probe complete\n"); -      g_print ("n_checks = %d\n", n_checks); - -      return TRUE; -    } -    for (item = ranges; item; item = item->next) { -      int min1; -      int max1; -      int mid; -      int mid_ret; - -      range = item->data; - -      g_print ("checking [%d,%d]\n", range->min, range->max); - -      mid = (range->min + range->max) / 2; -      mid_ret = check_rate (probe, mid); -      n_checks++; - -      if (mid == mid_ret && checking_exact_rates) { -        exact_rates++; -        if (exact_rates > 100) { -          g_print ("got 100 exact rates, assuming all are exact\n"); -          return 0; -        } -      } else { -        checking_exact_rates = FALSE; +  add_range (ranges, probe->min + 1, probe->max - 1); + +  while ((range = g_queue_pop_head (ranges))) { +    int min1; +    int max1; +    int mid; +    int mid_ret; + +    g_print ("checking [%d,%d]\n", range->min, range->max); + +    mid = (range->min + range->max) / 2; +    mid_ret = check_rate (probe, mid); +    n_checks++; + +    if (mid == mid_ret && checking_exact_rates) { +      int max_exact_matches = 100; + +      exact_rates++; +      if (exact_rates > max_exact_matches) { +        g_print ("got %d exact rates, assuming all are exact\n", +            max_exact_matches); +        result = FALSE; +        g_free (range); +        break;        } +    } else { +      checking_exact_rates = FALSE; +    } -      add_rate (probe->rates, mid_ret); - -#if 1 -      /* Assume that the rate is arithmetically rounded to the nearest -       * supported rate. */ +    /* Assume that the rate is arithmetically rounded to the nearest +     * supported rate. */ +    if (mid == mid_ret) { +      min1 = mid - 1; +      max1 = mid + 1; +    } else {        if (mid < mid_ret) {          min1 = mid - (mid_ret - mid);          max1 = mid_ret + 1; @@ -156,42 +153,35 @@ probe_check (Probe * probe)          min1 = mid_ret - 1;          max1 = mid + (mid - mid_ret);        } -#else -      /* Assume that the rate is not rounded past a supported rate */ -      if (mid < mid_ret) { -        min1 = mid - 1; -        max1 = mid_ret + 1; -      } else { -        min1 = mid_ret - 1; -        max1 = mid + 1; -      } -#endif - -      if (range->min < min1) { -        new_ranges = add_range (new_ranges, range->min, min1); -      } -      if (max1 < range->max) { -        new_ranges = add_range (new_ranges, max1, range->max); -      }      } -    /* leak ranges */ +    add_range (ranges, range->min, min1); +    add_range (ranges, max1, range->max); -    ranges = new_ranges; +    g_free (range);    } -  return 0; +  while ((range = g_queue_pop_head (ranges))) { +    g_free (range); +  } +  g_queue_free (ranges); + +  return result;  } -static GList * -add_range (GList * list, int min, int max) +static void +add_range (GQueue * queue, int min, int max)  { -  Range *range = g_new0 (Range, 1); +  g_print ("trying to add [%d,%d]\n", min, max); +  if (min <= max) { +    Range *range = g_new0 (Range, 1); -  range->min = min; -  range->max = max; +    range->min = min; +    range->max = max; -  return g_list_append (list, range); +    g_queue_push_tail (queue, range); +    //g_queue_push_head (queue, range); +  }  }  static int @@ -214,6 +204,7 @@ check_rate (Probe * probe, int irate)    if (rate == irate - 1 || rate == irate + 1) {      rate = irate;    } +  add_rate (probe->rates, rate);    return rate;  } @@ -232,3 +223,16 @@ add_rate (GArray * array, int rate)    g_print ("supported rate: %d\n", rate);    g_array_append_val (array, rate);  } + +static int +int_compare (gconstpointer a, gconstpointer b) +{ +  const int *va = (const int *) a; +  const int *vb = (const int *) b; + +  if (*va < *vb) +    return -1; +  if (*va > *vb) +    return 1; +  return 0; +}  | 
