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"); |