1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * you may not use this file except in compliance with the License.
6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * You may obtain a copy of the License at
7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * See the License for the specific language governing permissions and
14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * limitations under the License.
15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpackage com.android.internal.sound.sampled;
18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport android.media.AudioManager;
20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport android.media.MediaPlayer;
21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.io.ByteArrayInputStream;
23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.io.IOException;
24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.io.InputStream;
25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport javax.sound.sampled.AudioFormat;
27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport javax.sound.sampled.AudioInputStream;
28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport javax.sound.sampled.Clip;
29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport javax.sound.sampled.Control;
30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport javax.sound.sampled.Line;
31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport javax.sound.sampled.LineListener;
32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport javax.sound.sampled.LineUnavailableException;
33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport javax.sound.sampled.Control.Type;
34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/**
36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Implements an audio Clip for Android. Since Android's MediaPlayer is somewhat
37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * limited, we only support sample playback, but not recording or the querying
38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * of sample information. Many of the methods hence throw
39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * {@link java.lang.UnsupportedOperationException} or return dummy results.
40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpublic class AndroidClip implements Clip {
42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Holds the Android MediaPlayer we use.
45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private MediaPlayer player;
47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Holds the AndroidAudioInputStream we want to play.
50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private AndroidAudioInputStream stream;
52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public int getFrameLength() {
54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        throw new UnsupportedOperationException();
55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public long getMicrosecondLength() {
58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        throw new UnsupportedOperationException();
59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void loop(int count) {
62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        throw new UnsupportedOperationException();
63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void open(AudioFormat format, byte[] data, int offset, int bufferSize)
66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throws LineUnavailableException {
67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        InputStream stream = new ByteArrayInputStream(data, offset, bufferSize);
68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        open();
70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            this.stream = (AndroidAudioInputStream)(new AndroidAudioFileReader().getAudioInputStream(stream));
73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (Exception ex) {
74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new LineUnavailableException(ex.toString());
75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void open(AudioInputStream stream) throws LineUnavailableException, IOException {
79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        open();
80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (!(stream instanceof AndroidAudioInputStream)) {
82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            try {
83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                stream = new AndroidAudioFileReader().getAudioInputStream(stream);
84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } catch (Exception ex) {
85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                throw new LineUnavailableException(ex.toString());
86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this.stream = (AndroidAudioInputStream)stream;
90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void setFramePosition(int frames) {
93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        throw new UnsupportedOperationException();
94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void setLoopPoints(int start, int end) {
97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        throw new UnsupportedOperationException();
98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void setMicrosecondPosition(long microseconds) {
101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (!isOpen()) {
102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new IllegalStateException("Clip must be open");
103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        player.seekTo((int)(microseconds / 1000));
106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public int available() {
109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        throw new UnsupportedOperationException();
110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void drain() {
113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void flush() {
116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public int getBufferSize() {
119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        throw new UnsupportedOperationException();
120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public AudioFormat getFormat() {
123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        throw new UnsupportedOperationException();
124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public int getFramePosition() {
127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        throw new UnsupportedOperationException();
128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public float getLevel() {
131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        throw new UnsupportedOperationException();
132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public long getLongFramePosition() {
135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        throw new UnsupportedOperationException();
136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public long getMicrosecondPosition() {
139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (isOpen()) {
140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return player.getCurrentPosition() * 1000;
141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } else {
142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return 0;
143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public boolean isActive() {
147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return false;
148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public boolean isRunning() {
151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return player != null && player.isPlaying();
152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void start() {
155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (!isOpen()) {
156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new IllegalStateException("Clip must be open");
157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (stream == null) {
160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new IllegalStateException("Need an AudioInputStream to play");
161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (!isRunning()) {
164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            /*
165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project             * This is ugly, but there is no way around it: The javax.sound API
166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project             * doesn't expect to throw an exception at this point for illegal
167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project             * MIDI sequences. Since we don't really construct the MIDI sequence
168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project             * from the original binary data, but only refer to its URL, the
169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project             * MediaPlayer can actually bail out at this point. We wrap the
170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project             * exception into a RuntimeException, to at least keep the API
171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project             * contract.
172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project             */
173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            try {
174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                String s = this.stream.getURL().toExternalForm();
175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                /*
177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                 * TODO Workaround for 1107794: MediaPlayer doesn't handle
178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                 * "file:" URLs. Get rid of this.
179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                 */
180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                if (s.startsWith("file:")) {
181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    s = s.substring(5);
182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                player.setDataSource(s);
185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                player.setAudioStreamType(AudioManager.STREAM_MUSIC);
186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                player.prepare();
187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } catch (IOException ex) {
188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                throw new RuntimeException(ex.toString());
189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            player.start();
192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void stop() {
196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (!isOpen()) {
197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new IllegalStateException("Clip must be open");
198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (isRunning()) {
201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            player.stop();
202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void addLineListener(LineListener listener) {
206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        throw new UnsupportedOperationException();
207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void close() {
210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (isOpen()) {
211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            stop();
212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            player = null;
213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public Control getControl(Type control) {
217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        throw new IllegalArgumentException("No controls available");
218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public Control[] getControls() {
221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return new Control[0];
222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public javax.sound.sampled.Line.Info getLineInfo() {
225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return new Line.Info(this.getClass());
226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public boolean isControlSupported(Type control) {
229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return false;
230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public boolean isOpen() {
233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return player != null;
234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void open() throws LineUnavailableException {
237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            player = new MediaPlayer();
239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (Exception ex) {
240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new LineUnavailableException(ex.toString());
241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void removeLineListener(LineListener listener) {
245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        throw new UnsupportedOperationException();
246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
249