1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  Licensed to the Apache Software Foundation (ASF) under one or more
3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  contributor license agreements.  See the NOTICE file distributed with
4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  this work for additional information regarding copyright ownership.
5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  The ASF licenses this file to You under the Apache License, Version 2.0
6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  (the "License"); you may not use this file except in compliance with
7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  the License.  You may obtain a copy of the License at
8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *     http://www.apache.org/licenses/LICENSE-2.0
10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  See the License for the specific language governing permissions and
15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  limitations under the License.
16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpackage javax.sound.sampled;
19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.io.File;
21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.io.IOException;
22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.io.InputStream;
23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.io.OutputStream;
24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.net.URL;
25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.util.ArrayList;
26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.util.List;
27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.util.Iterator;
28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.util.Properties;
29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport javax.sound.sampled.spi.AudioFileReader;
31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport javax.sound.sampled.spi.AudioFileWriter;
32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport javax.sound.sampled.spi.FormatConversionProvider;
33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport javax.sound.sampled.spi.MixerProvider;
34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport org.apache.harmony.sound.utils.ProviderService;
36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport org.apache.harmony.sound.internal.nls.Messages;
38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpublic class AudioSystem {
40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static final int NOT_SPECIFIED = -1;
42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private final static String audioFileReaderPath = "META-INF/services/javax.sound.sampled.spi.AudioFileReader"; //$NON-NLS-1$
44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private final static String audioFileWriterPath = "META-INF/services/javax.sound.sampled.spi.AudioFileWriter"; //$NON-NLS-1$
46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private final static String formatConversionProviderPath = "META-INF/services/javax.sound.sampled.spi.FormatConversionProvider"; //$NON-NLS-1$
48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private final static String mixerProviderPath = "META-INF/services/javax.sound.sampled.spi.MixerProvider"; //$NON-NLS-1$
50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private final static String CLIP = "javax.sound.sampled.Clip"; //$NON-NLS-1$
52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private final static String PORT = "javax.sound.sampled.Port"; //$NON-NLS-1$
54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private final static String SOURCEDATALINE = "javax.sound.sampled.SourceDataLine"; //$NON-NLS-1$
56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private final static String TARGETDATALINE = "javax.sound.sampled.TargetDataLine"; //$NON-NLS-1$
58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static Mixer.Info[] getMixerInfo() {
60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        List<Mixer.Info> result = new ArrayList<Mixer.Info>();
61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (Iterator providers = ProviderService.getProviders(
62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                mixerProviderPath).iterator(); providers.hasNext();) {
63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            try {
64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                Mixer.Info[] infos = ((MixerProvider) (providers.next()))
65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        .getMixerInfo();
66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                for (Mixer.Info info : infos) {
67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    result.add(info);
68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } catch (ClassCastException e) {}
70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Mixer.Info[] temp = new Mixer.Info[result.size()];
72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return result.toArray(temp);
73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static Mixer getMixer(Mixer.Info info) {
76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Mixer.Info[] infos;
77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Mixer.Info inf;
78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (info == null) {
79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            infos = getMixerInfo();
80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (infos == null) {
81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                throw new IllegalArgumentException(
82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        "No system default mixer installed"); //$NON-NLS-1$
83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            inf = infos[0];
85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } else {
86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            inf = info;
87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (Iterator providers = ProviderService.getProviders(
90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                mixerProviderPath).iterator(); providers.hasNext();) {
91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            try {
92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return ((MixerProvider) (providers.next())).getMixer(inf);
93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } catch (ClassCastException e) {} catch (IllegalArgumentException e) {}
94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        throw new IllegalArgumentException("Mixer not supported: " + inf); //$NON-NLS-1$
96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static Line.Info[] getSourceLineInfo(Line.Info info) {
99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        List<Line.Info> result = new ArrayList<Line.Info>();
100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (Iterator providers = ProviderService.getProviders(
101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                mixerProviderPath).iterator(); providers.hasNext();) {
102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            try {
103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                MixerProvider pr = (MixerProvider) providers.next();
104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                Mixer.Info[] mixinfos = pr.getMixerInfo();
105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                for (Mixer.Info mixinfo : mixinfos) {
106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    Mixer mix = pr.getMixer(mixinfo);
107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    Line.Info[] linfos = mix.getSourceLineInfo(info);
108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    for (Line.Info linfo : linfos) {
109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        result.add(linfo);
110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    }
111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } catch (ClassCastException e) {}
113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Line.Info[] temp = new Line.Info[result.size()];
115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return result.toArray(temp);
116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static Line.Info[] getTargetLineInfo(Line.Info info) {
119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        List<Line.Info> result = new ArrayList<Line.Info>();
120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (Iterator providers = ProviderService.getProviders(
121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                mixerProviderPath).iterator(); providers.hasNext();) {
122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            try {
123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                MixerProvider pr = (MixerProvider) providers.next();
124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                Mixer.Info[] mixinfos = pr.getMixerInfo();
125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                for (Mixer.Info mixinfo : mixinfos) {
126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    Mixer mix = pr.getMixer(mixinfo);
127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    Line.Info[] linfos = mix.getTargetLineInfo(info);
128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    for (Line.Info linfo : linfos) {
129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        result.add(linfo);
130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    }
131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } catch (ClassCastException e) {}
133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Line.Info[] temp = new Line.Info[result.size()];
135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return result.toArray(temp);
136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static boolean isLineSupported(Line.Info info) {
139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (Iterator providers = ProviderService.getProviders(
141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                mixerProviderPath).iterator(); providers.hasNext();) {
142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            try {
143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                MixerProvider pr = (MixerProvider) providers.next();
144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                Mixer.Info[] mixinfos = pr.getMixerInfo();
145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                for (Mixer.Info mixinfo : mixinfos) {
146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    Mixer mix = pr.getMixer(mixinfo);
147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    if (mix.isLineSupported(info)) {
148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        return true;
149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    }
150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } catch (ClassCastException e) {}
152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return false;
154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private static Mixer getMixer(String propVal, Line.Info info,
157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            List<?> mixerProviders) {
158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int index = propVal.indexOf("#"); //$NON-NLS-1$
160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        String className;
161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        String mixName;
162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (index == -1) {
163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            className = propVal.trim();
164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            mixName = ""; //$NON-NLS-1$
165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } else {
166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            className = propVal.substring(0, index).trim();
167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (index == propVal.length()) {
168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                mixName = ""; //$NON-NLS-1$
169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } else {
170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                mixName = propVal.substring(index + 1).trim();
171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Mixer.Info[] minfos = null;
174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (!className.equals("")) { //$NON-NLS-1$
175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            for (Iterator providers = mixerProviders.iterator(); providers
176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    .hasNext();) {
177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                try {
178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    MixerProvider pr = (MixerProvider) (providers.next());
179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    if (className.equals(pr.getClass().getName())) {
180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        minfos = pr.getMixerInfo();
181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        break;
182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    }
183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                } catch (ClassCastException e) {}
184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (minfos == null) {
187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            minfos = getMixerInfo();
188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (!mixName.equals("")) { //$NON-NLS-1$
191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            for (Mixer.Info minfo : minfos) {
192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                if (mixName.equals(minfo.getName())) {
193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    return getMixer(minfo);
194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (minfos.length > 0) {
198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return getMixer(minfos[0]);
199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return null;
201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static Line getLine(Line.Info info) throws LineUnavailableException {
204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        String propName = null;
205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Class lineClass = info.getLineClass();
206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (Clip.class.isAssignableFrom(lineClass)) {
208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            propName = CLIP;
209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } else if (Port.class.isAssignableFrom(lineClass)) {
210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            propName = PORT;
211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } else if (SourceDataLine.class.isAssignableFrom(lineClass)) {
212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            propName = SOURCEDATALINE;
213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } else if (TargetDataLine.class.isAssignableFrom(lineClass)) {
214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            propName = TARGETDATALINE;
215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return getLine(propName, info);
217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private static Line getLine(String propName, Line.Info info)
220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throws LineUnavailableException {
221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        List<?> mixerProviders = ProviderService
223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                .getProviders(mixerProviderPath);
224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (propName != null) {
226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            String propVal = System.getProperty(propName);
227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (propVal != null) {
228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                Mixer m = getMixer(propVal, info, mixerProviders);
229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                if (m != null) {
230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    Line l = m.getLine(info);
231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    if (l != null) {
232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        return l;
233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    }
234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Properties soundProperties = ProviderService.getSoundProperties();
238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            propVal = soundProperties.getProperty(propName);
239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (propVal != null) {
240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                Mixer m = getMixer(propVal, info, mixerProviders);
241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                if (m != null) {
242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    Line l = m.getLine(info);
243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    if (l != null) {
244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        return l;
245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    }
246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (Iterator providers = ProviderService.getProviders(
251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                mixerProviderPath).iterator(); providers.hasNext();) {
252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            try {
253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                MixerProvider pr = (MixerProvider) (providers.next());
254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                Mixer.Info[] mixinfos = pr.getMixerInfo();
255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                for (Mixer.Info mixinfo : mixinfos) {
256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    try {
257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        Mixer mix = pr.getMixer(mixinfo);
258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        return mix.getLine(info);
259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    } catch (IllegalArgumentException e) {
260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        // continue
261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    }
262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } catch (ClassCastException e) {}
264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // BEGIN android-added
267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (CLIP.equals(propName)) {
268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            try {
269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return (Clip)(Class.forName("com.android.internal.sound.sampled.AndroidClip").newInstance());
270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } catch (Exception ex) {
271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                // Ignore
272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // END android-added
275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // sound.11=Could not get line
277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        throw new IllegalArgumentException(Messages.getString("sound.11")); //$NON-NLS-1$
278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static Clip getClip() throws LineUnavailableException {
281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return (Clip) getLine(new Line.Info(Clip.class));
282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static Clip getClip(Mixer.Info mixerInfo)
285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throws LineUnavailableException {
286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return (Clip) (getMixer(mixerInfo).getLine(new Line.Info(Clip.class)));
287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static SourceDataLine getSourceDataLine(AudioFormat format)
290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throws LineUnavailableException {
291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        SourceDataLine line = (SourceDataLine) getLine(new Line.Info(
292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                SourceDataLine.class));
293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        line.open(format);
294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return line;
295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static SourceDataLine getSourceDataLine(AudioFormat format,
298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Mixer.Info mixerinfo) throws LineUnavailableException {
299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        SourceDataLine line = (SourceDataLine) getMixer(mixerinfo).getLine(
301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                new Line.Info(SourceDataLine.class));
302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        line.open(format);
303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return line;
304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static TargetDataLine getTargetDataLine(AudioFormat format)
307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throws LineUnavailableException {
308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        TargetDataLine line = (TargetDataLine) getLine(new Line.Info(
309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                TargetDataLine.class));
310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        line.open(format);
311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return line;
312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static TargetDataLine getTargetDataLine(AudioFormat format,
315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Mixer.Info mixerinfo) throws LineUnavailableException {
316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        TargetDataLine line = (TargetDataLine) getMixer(mixerinfo).getLine(
318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                new Line.Info(TargetDataLine.class));
319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        line.open(format);
320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return line;
321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static AudioFormat.Encoding[] getTargetEncodings(
324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            AudioFormat.Encoding sourceEncoding) {
325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        List<AudioFormat.Encoding> result = new ArrayList<AudioFormat.Encoding>();
327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (Iterator providers = ProviderService.getProviders(
328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                formatConversionProviderPath).iterator(); providers.hasNext();) {
329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            try {
330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                FormatConversionProvider pr = (FormatConversionProvider) providers
331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        .next();
332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                if (!pr.isSourceEncodingSupported(sourceEncoding)) {
333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    continue;
334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                AudioFormat.Encoding[] encodings = pr.getTargetEncodings();
336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                for (AudioFormat.Encoding encoding : encodings) {
337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    result.add(encoding);
338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } catch (ClassCastException e) {}
340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        AudioFormat.Encoding[] temp = new AudioFormat.Encoding[result.size()];
342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return result.toArray(temp);
343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static AudioFormat.Encoding[] getTargetEncodings(
346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            AudioFormat sourceFormat) {
347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        List<AudioFormat.Encoding> result = new ArrayList<AudioFormat.Encoding>();
349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (Iterator providers = ProviderService.getProviders(
350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                formatConversionProviderPath).iterator(); providers.hasNext();) {
351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            try {
352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                AudioFormat.Encoding[] encodings = ((FormatConversionProvider) (providers
353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        .next())).getTargetEncodings(sourceFormat);
354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                for (AudioFormat.Encoding encoding : encodings) {
355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    result.add(encoding);
356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } catch (ClassCastException e) {}
358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        AudioFormat.Encoding[] temp = new AudioFormat.Encoding[result.size()];
360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return result.toArray(temp);
361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static boolean isConversionSupported(
364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            AudioFormat.Encoding targetEncoding, AudioFormat sourceFormat) {
365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (Iterator providers = ProviderService.getProviders(
367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                formatConversionProviderPath).iterator(); providers.hasNext();) {
368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (((FormatConversionProvider) (providers.next()))
369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    .isConversionSupported(targetEncoding, sourceFormat)) {
370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return true;
371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return false;
374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static AudioInputStream getAudioInputStream(
377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            AudioFormat.Encoding targetEncoding, AudioInputStream sourceStream) {
378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (sourceStream.getFormat().getEncoding().equals(targetEncoding)) {
380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return sourceStream;
381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (Iterator providers = ProviderService.getProviders(
383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                formatConversionProviderPath).iterator(); providers.hasNext();) {
384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            try {
385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return ((FormatConversionProvider) (providers.next()))
386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        .getAudioInputStream(targetEncoding, sourceStream);
387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } catch (ClassCastException e) {} catch (IllegalArgumentException e) {}
388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // sound.12=Could not get audio input stream from source stream
390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        throw new IllegalArgumentException(Messages.getString("sound.12")); //$NON-NLS-1$
391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static AudioFormat[] getTargetFormats(
394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            AudioFormat.Encoding targetEncoding, AudioFormat sourceFormat) {
395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        List<AudioFormat> result = new ArrayList<AudioFormat>();
397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (Iterator providers = ProviderService.getProviders(
398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                formatConversionProviderPath).iterator(); providers.hasNext();) {
399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            try {
400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                AudioFormat[] formats = ((FormatConversionProvider) (providers
401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        .next()))
402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        .getTargetFormats(targetEncoding, sourceFormat);
403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                for (AudioFormat format : formats) {
404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    result.add(format);
405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } catch (ClassCastException e) {}
407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        AudioFormat[] temp = new AudioFormat[result.size()];
409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return result.toArray(temp);
410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static boolean isConversionSupported(AudioFormat targetFormat,
413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            AudioFormat sourceFormat) {
414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (Iterator providers = ProviderService.getProviders(
416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                formatConversionProviderPath).iterator(); providers.hasNext();) {
417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (((FormatConversionProvider) (providers.next()))
418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    .isConversionSupported(targetFormat, sourceFormat)) {
419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return true;
420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return false;
423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static AudioInputStream getAudioInputStream(
426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            AudioFormat targetFormat, AudioInputStream sourceStream) {
427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (sourceStream.getFormat().matches(targetFormat)) {
429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return sourceStream;
430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (Iterator providers = ProviderService.getProviders(
432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                formatConversionProviderPath).iterator(); providers.hasNext();) {
433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            try {
434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return ((FormatConversionProvider) (providers.next()))
435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        .getAudioInputStream(targetFormat, sourceStream);
436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } catch (ClassCastException e) {} catch (IllegalArgumentException e) {}
437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // sound.13=Could not get audio input stream from source stream
439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        throw new IllegalArgumentException(Messages.getString("sound.13")); //$NON-NLS-1$
440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static AudioFileFormat getAudioFileFormat(InputStream stream)
443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throws UnsupportedAudioFileException, IOException {
444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (Iterator providers = ProviderService.getProviders(
446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                audioFileReaderPath).iterator(); providers.hasNext();) {
447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            try {
448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return ((AudioFileReader) (providers.next()))
449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        .getAudioFileFormat(stream);
450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } catch (ClassCastException e) {} catch (UnsupportedAudioFileException e) {}
451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // sound.14=File is not a supported file type
453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        throw new UnsupportedAudioFileException(Messages.getString("sound.14")); //$NON-NLS-1$
454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static AudioFileFormat getAudioFileFormat(URL url)
457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throws UnsupportedAudioFileException, IOException {
458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (Iterator providers = ProviderService.getProviders(
460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                audioFileReaderPath).iterator(); providers.hasNext();) {
461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            try {
462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return ((AudioFileReader) (providers.next()))
463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        .getAudioFileFormat(url);
464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } catch (ClassCastException e) {} catch (UnsupportedAudioFileException e) {}
465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // sound.14=File is not a supported file type
467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        throw new UnsupportedAudioFileException(Messages.getString("sound.14")); //$NON-NLS-1$
468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static AudioFileFormat getAudioFileFormat(File file)
471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throws UnsupportedAudioFileException, IOException {
472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (Iterator providers = ProviderService.getProviders(
474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                audioFileReaderPath).iterator(); providers.hasNext();) {
475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            try {
476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return ((AudioFileReader) (providers.next()))
477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        .getAudioFileFormat(file);
478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } catch (ClassCastException e) {} catch (UnsupportedAudioFileException e) {}
479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // sound.14=File is not a supported file type
481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        throw new UnsupportedAudioFileException(Messages.getString("sound.14")); //$NON-NLS-1$
482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static AudioInputStream getAudioInputStream(InputStream stream)
485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throws UnsupportedAudioFileException, IOException {
486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (stream instanceof AudioInputStream) {
488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return (AudioInputStream) stream;
489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (Iterator providers = ProviderService.getProviders(
491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                audioFileReaderPath).iterator(); providers.hasNext();) {
492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            try {
493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return ((AudioFileReader) (providers.next()))
494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        .getAudioInputStream(stream);
495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } catch (ClassCastException e) {} catch (UnsupportedAudioFileException e) {}
496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // BEGIN android-added
498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
499f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            AudioFileReader reader = (AudioFileReader)(Class.forName("com.android.internal.sound.sampled.AndroidAudioFileReader").newInstance());
500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return reader.getAudioInputStream(stream);
501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (Exception ex) {
502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            // Ignore
503f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // END android-added
505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // sound.15=Could not get audio input stream from input stream
506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        throw new UnsupportedAudioFileException(Messages.getString("sound.15")); //$NON-NLS-1$
507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static AudioInputStream getAudioInputStream(URL url)
510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throws UnsupportedAudioFileException, IOException {
511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (Iterator providers = ProviderService.getProviders(
513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                audioFileReaderPath).iterator(); providers.hasNext();) {
514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            try {
515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return ((AudioFileReader) (providers.next()))
516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        .getAudioInputStream(url);
517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } catch (ClassCastException e) {} catch (UnsupportedAudioFileException e) {}
518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // BEGIN android-added
520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            AudioFileReader reader = (AudioFileReader)(Class.forName("com.android.internal.sound.sampled.AndroidAudioFileReader").newInstance());
522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return reader.getAudioInputStream(url);
523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (Exception ex) {
524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            // Ignore
525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // END android-added
527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // sound.16=Could not get audio input stream from input URL
528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        throw new UnsupportedAudioFileException(Messages.getString("sound.16")); //$NON-NLS-1$
529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static AudioInputStream getAudioInputStream(File file)
532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throws UnsupportedAudioFileException, IOException {
533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (Iterator providers = ProviderService.getProviders(
535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                audioFileReaderPath).iterator(); providers.hasNext();) {
536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            try {
537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return ((AudioFileReader) (providers.next()))
538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        .getAudioInputStream(file);
539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } catch (ClassCastException e) {} catch (UnsupportedAudioFileException e) {}
540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // BEGIN android-added
542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            AudioFileReader reader = (AudioFileReader)(Class.forName("com.android.internal.sound.sampled.AndroidAudioFileReader").newInstance());
544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return reader.getAudioInputStream(file);
545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (Exception ex) {
546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            // Ignore
547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // END android-added
549f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // sound.17=Could not get audio input stream from input file
550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        throw new UnsupportedAudioFileException(Messages.getString("sound.17")); //$NON-NLS-1$
551f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
552f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static AudioFileFormat.Type[] getAudioFileTypes() {
554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        List<AudioFileFormat.Type> result = new ArrayList<AudioFileFormat.Type>();
555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (Iterator providers = ProviderService.getProviders(
556f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                audioFileWriterPath).iterator(); providers.hasNext();) {
557f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            try {
558f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                AudioFileFormat.Type[] types = ((AudioFileWriter) (providers
559f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        .next())).getAudioFileTypes();
560f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                for (AudioFileFormat.Type type : types) {
561f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    result.add(type);
562f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
563f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } catch (ClassCastException e) {}
564f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
565f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        AudioFileFormat.Type[] temp = new AudioFileFormat.Type[result.size()];
566f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return result.toArray(temp);
567f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
568f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
569f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static boolean isFileTypeSupported(AudioFileFormat.Type fileType) {
570f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
571f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (Iterator providers = ProviderService.getProviders(
572f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                audioFileWriterPath).iterator(); providers.hasNext();) {
573f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (((AudioFileWriter) (providers.next()))
574f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    .isFileTypeSupported(fileType)) {
575f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return true;
576f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
577f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
578f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return false;
579f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
580f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
581f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static AudioFileFormat.Type[] getAudioFileTypes(
582f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            AudioInputStream stream) {
583f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        List<AudioFileFormat.Type> result = new ArrayList<AudioFileFormat.Type>();
584f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (Iterator providers = ProviderService.getProviders(
585f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                audioFileWriterPath).iterator(); providers.hasNext();) {
586f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            try {
587f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                AudioFileFormat.Type[] types = ((AudioFileWriter) (providers
588f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        .next())).getAudioFileTypes(stream);
589f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                for (AudioFileFormat.Type type : types) {
590f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    result.add(type);
591f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
592f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } catch (ClassCastException e) {}
593f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
594f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        AudioFileFormat.Type[] temp = new AudioFileFormat.Type[result.size()];
595f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return result.toArray(temp);
596f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
597f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
598f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static boolean isFileTypeSupported(AudioFileFormat.Type fileType,
599f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            AudioInputStream stream) {
600f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
601f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (Iterator providers = ProviderService.getProviders(
602f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                audioFileWriterPath).iterator(); providers.hasNext();) {
603f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (((AudioFileWriter) (providers.next())).isFileTypeSupported(
604f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    fileType, stream)) {
605f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return true;
606f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
607f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
608f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return false;
609f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
610f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
611f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static int write(AudioInputStream stream,
612f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            AudioFileFormat.Type fileType, OutputStream out) throws IOException {
613f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        AudioFileWriter writer;
614f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (Iterator providers = ProviderService.getProviders(
615f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                audioFileWriterPath).iterator(); providers.hasNext();) {
616f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            writer = (AudioFileWriter) (providers.next());
617f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (writer.isFileTypeSupported(fileType, stream)) {
618f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return writer.write(stream, fileType, out);
619f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
620f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
621f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // sound.18=Type is not supported
622f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        throw new IllegalArgumentException(Messages.getString("sound.18")); //$NON-NLS-1$
623f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
624f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
625f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static int write(AudioInputStream stream,
626f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            AudioFileFormat.Type fileType, File out) throws IOException {
627f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        AudioFileWriter writer;
628f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (Iterator providers = ProviderService.getProviders(
629f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                audioFileWriterPath).iterator(); providers.hasNext();) {
630f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            writer = (AudioFileWriter) (providers.next());
631f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (writer.isFileTypeSupported(fileType, stream)) {
632f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return writer.write(stream, fileType, out);
633f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
634f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
635f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // sound.18=Type is not supported
636f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        throw new IllegalArgumentException(Messages.getString("sound.18")); //$NON-NLS-1$
637f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
638f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
639