package com.shoutcastwhitelabel.player; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import java.net.URLConnection; import java.util.Calendar; import java.util.GregorianCalendar; import android.os.Environment; public class ShoutcastFile { String m_shoutcast_name; String m_file_name; int m_bitrate; long m_current_write_pos; long m_buffer_mark_pos = 0; boolean m_done = false; boolean m_notified_buffering_done = false; String m_errors = ""; File m_file; File m_nagare_dir; public ShoutcastFile(URLConnection connection) { m_shoutcast_name = connection.getHeaderField("icy-name"); m_bitrate = Integer.parseInt(connection.getHeaderField("icy-br")); build_file_name(); } public void build_file_name() { Calendar now = new GregorianCalendar(); m_file_name = m_shoutcast_name.replaceAll("[\\/:*?\"<>|]", "_"); m_file_name += "-" + now.get(Calendar.YEAR) + now.get(Calendar.MONTH) + now.get(Calendar.DAY_OF_MONTH) + now.get(Calendar.HOUR_OF_DAY) + now.get(Calendar.MINUTE) + now.get(Calendar.SECOND) + ".mp3"; m_nagare_dir = new File(Environment.getExternalStorageDirectory() + "/Nagare"); m_nagare_dir.mkdirs(); m_file = new File(m_nagare_dir.getAbsolutePath(), m_file_name); } public void done() { m_done = true; } public String errors() { return m_errors; } public String file_path() { return m_file.getAbsolutePath(); } public void download(DownloadThread download_thread, InputStream input) { try { FileOutputStream output = new FileOutputStream(m_file); byte[] buffer = new byte[1024]; int numRead; while ((numRead = input.read(buffer)) != -1 && !m_done) { output.write(buffer, 0, numRead); m_current_write_pos += numRead; } } catch (Exception e) { m_errors += e.toString() + "\n"; } done(); } public void rebuffer() { m_buffer_mark_pos = m_current_write_pos; m_notified_buffering_done = true; } }
package com.shoutcastwhitelabel.player; import java.net.MalformedURLException; import java.net.URL; import com.shoutcastwhitelabel.player.INagareService; import android.app.Service; import android.content.Intent; import android.media.MediaPlayer; import android.media.MediaScannerConnection; import android.media.MediaPlayer.OnCompletionListener; import android.os.Handler; import android.os.IBinder; public class NagareService extends Service implements OnCompletionListener { public static URL m_url = null; public static DownloadThread m_download_thread = null; public static MediaPlayer m_media_player = null; public static int m_current_position = 0; public static String m_errors = ""; public static int m_state = 0; public static final int STOPPED = 0; public static final int PLAYING = 1; public static final int BUFFERING = 2; public static MediaScannerConnection m_scanner = null; public static final int BUFFER_BEFORE_PLAY = 65536; private final static Runnable m_run_buffer = new Runnable() { public void run() { int delay = buffer(); if (delay > 0) { m_handler.postDelayed(this, delay); } } }; private final static Handler m_handler = new Handler(); public NagareService() { //Don't set m_state here, we want to persist it across service binds/unbinds } public static int buffer() { if (m_download_thread == null || m_download_thread.m_shoutcast_file == null) { if (m_state == BUFFERING) { return 1000; } else { stop(); return 1000; } } if (m_download_thread.m_shoutcast_file.m_done) { stop(); return 0; } if (m_download_thread.m_shoutcast_file.m_current_write_pos - m_current_position > BUFFER_BEFORE_PLAY) { try { m_media_player.reset(); m_media_player.setDataSource(m_download_thread.m_shoutcast_file.file_path()); m_media_player.prepare(); } catch (Exception e) { m_errors += "Error starting media player on '" + m_download_thread.m_shoutcast_file.file_path() + "': " + e.toString() + "\n"; } m_media_player.seekTo(m_current_position); m_media_player.start(); m_state = PLAYING; return 0; } else { m_state = BUFFERING; return 1000; } } public static void download(String url_string) { m_errors = ""; try { m_url = new URL(url_string); } catch (MalformedURLException e) { m_errors += "Error parsing URL (" + url_string + "): " + e.toString() + "\n"; } if (m_errors == "") { m_download_thread = new DownloadThread(m_url); m_download_thread.start(); m_current_position = 0; m_state = BUFFERING; if (m_media_player == null) { m_media_player = new MediaPlayer(); m_media_player.setOnCompletionListener(null); } m_run_buffer.run(); } } public static String errors() { if (m_download_thread != null) { return m_errors + m_download_thread.errors(); } return m_errors; } public static String file_name() { if (m_download_thread == null) { return null; } if (m_download_thread.m_shoutcast_file == null) { return null; } return m_download_thread.m_shoutcast_file.m_file_name; } public IBinder onBind(Intent intent) { return m_binder; } public void onCompletion(MediaPlayer mp) { m_current_position = mp.getCurrentPosition(); m_run_buffer.run(); } public static long position() { if (m_download_thread == null) { return -1; } if (m_download_thread.m_shoutcast_file == null) { return -1; } return m_download_thread.m_shoutcast_file.m_current_write_pos; } public static int state() { return m_state; } public static void stop() { if (m_download_thread != null) { m_download_thread.done(); m_download_thread = null; } if (m_media_player != null) { if (m_state == PLAYING) { m_media_player.stop(); } } m_state = STOPPED; } private final static INagareService.Stub m_binder = new INagareService.Stub() { public void download(String url) { NagareService.download(url); } public String errors() { return NagareService.errors(); } public String file_name() { return NagareService.file_name(); } public long position() { return NagareService.position(); } public int state() { return NagareService.state(); } public void stop() { NagareService.stop(); } }; }
เพื่อความปลอดภัยของเว็บบอร์ด ไม่อนุญาติให้แทรก แท็ก [img]....[/img] โดยการอัพโหลดไฟล์รูปจากที่อื่น เช่นเว็บไซต์ ฟรีอัพโหลดต่าง ๆ อัพโหลดแทรกรูปภาพ ให้ใช้บริการอัพโหลดไฟล์ของไทยครีเอท และตัดรูปภาพให้พอดีกับสกรีน เพื่อความโหลดเร็วและไฟล์ไม่ถูกลบทิ้ง