|
Line 0
Link Here
|
|
|
1 |
https://github.com/cmus/cmus/pull/614 |
| 2 |
--- op/oss.c.orig 2016-11-20 12:29:46 UTC |
| 3 |
+++ op/oss.c |
| 4 |
@@ -48,20 +48,49 @@ static int oss_reset(void) |
| 5 |
return 0; |
| 6 |
} |
| 7 |
|
| 8 |
-/* defined only in OSSv4, but seem to work in OSSv3 (Linux) */ |
| 9 |
-#ifndef AFMT_S32_LE |
| 10 |
-#define AFMT_S32_LE 0x00001000 |
| 11 |
+struct oss_fmt { |
| 12 |
+ int fmt, bits, sig, be; |
| 13 |
+}; |
| 14 |
+static struct oss_fmt oss_fmts[] = { |
| 15 |
+ { AFMT_S16_BE, 16, 1, 1 }, |
| 16 |
+ { AFMT_S16_LE, 16, 1, 0 }, |
| 17 |
+#ifdef AFMT_S24_BE |
| 18 |
+ { AFMT_S24_BE, 24, 1, 1 }, |
| 19 |
#endif |
| 20 |
-#ifndef AFMT_S32_BE |
| 21 |
-#define AFMT_S32_BE 0x00002000 |
| 22 |
+#ifdef AFMT_S24_LE |
| 23 |
+ { AFMT_S24_LE, 24, 1, 0 }, |
| 24 |
#endif |
| 25 |
-#ifndef AFMT_S24_PACKED |
| 26 |
-#define AFMT_S24_PACKED 0x00040000 |
| 27 |
+#ifdef AFMT_S32_BE |
| 28 |
+ { AFMT_S32_BE, 32, 1, 1 }, |
| 29 |
+#endif |
| 30 |
+#ifdef AFMT_S32_LE |
| 31 |
+ { AFMT_S32_LE, 32, 1, 0 }, |
| 32 |
#endif |
| 33 |
|
| 34 |
+ { AFMT_U16_BE, 16, 0, 1 }, |
| 35 |
+ { AFMT_U16_LE, 16, 0, 0 }, |
| 36 |
+#ifdef AFMT_U24_BE |
| 37 |
+ { AFMT_U24_BE, 24, 0, 1 }, |
| 38 |
+#endif |
| 39 |
+#ifdef AFMT_U24_LE |
| 40 |
+ { AFMT_U24_LE, 24, 0, 0 }, |
| 41 |
+#endif |
| 42 |
+#ifdef AFMT_U32_BE |
| 43 |
+ { AFMT_U32_BE, 32, 0, 1 }, |
| 44 |
+#endif |
| 45 |
+#ifdef AFMT_U32_LE |
| 46 |
+ { AFMT_U32_LE, 32, 0, 0 }, |
| 47 |
+#endif |
| 48 |
+ { AFMT_S8, 8, 1, 0 }, |
| 49 |
+ { AFMT_S8, 8, 1, 1 }, |
| 50 |
+ { AFMT_U8, 8, 0, 0 }, |
| 51 |
+ { AFMT_U8, 8, 0, 1 }, |
| 52 |
+}; |
| 53 |
+ |
| 54 |
static int oss_set_sf(sample_format_t sf) |
| 55 |
{ |
| 56 |
- int tmp, log2_fragment_size, nr_fragments, bytes_per_second; |
| 57 |
+ int found, tmp, log2_fragment_size, nr_fragments, bytes_per_second; |
| 58 |
+ size_t i; |
| 59 |
|
| 60 |
oss_reset(); |
| 61 |
oss_sf = sf; |
| 62 |
@@ -76,35 +105,17 @@ static int oss_set_sf(sample_format_t sf |
| 63 |
return -1; |
| 64 |
#endif |
| 65 |
|
| 66 |
- if (sf_get_bits(oss_sf) == 16) { |
| 67 |
- if (sf_get_signed(oss_sf)) { |
| 68 |
- if (sf_get_bigendian(oss_sf)) { |
| 69 |
- tmp = AFMT_S16_BE; |
| 70 |
- } else { |
| 71 |
- tmp = AFMT_S16_LE; |
| 72 |
- } |
| 73 |
- } else { |
| 74 |
- if (sf_get_bigendian(oss_sf)) { |
| 75 |
- tmp = AFMT_U16_BE; |
| 76 |
- } else { |
| 77 |
- tmp = AFMT_U16_LE; |
| 78 |
- } |
| 79 |
- } |
| 80 |
- } else if (sf_get_bits(oss_sf) == 8) { |
| 81 |
- if (sf_get_signed(oss_sf)) { |
| 82 |
- tmp = AFMT_S8; |
| 83 |
- } else { |
| 84 |
- tmp = AFMT_U8; |
| 85 |
- } |
| 86 |
- } else if (sf_get_bits(oss_sf) == 32 && sf_get_signed(oss_sf)) { |
| 87 |
- if (sf_get_bigendian(oss_sf)) { |
| 88 |
- tmp = AFMT_S32_BE; |
| 89 |
- } else { |
| 90 |
- tmp = AFMT_S32_LE; |
| 91 |
+ found = 0; |
| 92 |
+ for (i = 0; i < sizeof(oss_fmts)/sizeof(oss_fmts[0]); i++) { |
| 93 |
+ if (sf_get_bits(oss_sf) == oss_fmts[i].bits && |
| 94 |
+ sf_get_signed(oss_sf) == oss_fmts[i].sig && |
| 95 |
+ sf_get_bigendian(oss_sf) == oss_fmts[i].be) { |
| 96 |
+ found = 1; |
| 97 |
+ tmp = oss_fmts[i].fmt; |
| 98 |
+ break; |
| 99 |
} |
| 100 |
- } else if (sf_get_bits(oss_sf) == 24 && sf_get_signed(oss_sf) && !sf_get_bigendian(oss_sf)) { |
| 101 |
- tmp = AFMT_S24_PACKED; |
| 102 |
- } else { |
| 103 |
+ } |
| 104 |
+ if (!found) { |
| 105 |
d_print("unsupported sample format: %c%u_%s\n", |
| 106 |
sf_get_signed(oss_sf) ? 'S' : 'U', sf_get_bits(oss_sf), |
| 107 |
sf_get_bigendian(oss_sf) ? "BE" : "LE"); |