/* * myLib - https://github.com/taktod/myLib * Copyright (c) 2014 ttProject. All rights reserved. * * Licensed under The MIT license. */ package com.ttProject.packet; import java.io.FileOutputStream; import java.nio.ByteBuffer; import java.nio.channels.Channels; import java.nio.channels.WritableByteChannel; /** * MediaPacket動作の共通動作部分抜きだし * @author taktod */ public abstract class MediaPacket implements IMediaPacket { /** 保持データ実体 */ private ByteBuffer buffer; private float duration = 0; /** * 書き込み用のバッファ参照 * TODO この方法だと、bufferが大きくなると動作が重くなります。 * @param size 必要サイズ * @return */ protected ByteBuffer getBuffer(int size) { if(buffer == null) { // なかったら新規作成 buffer = ByteBuffer.allocate(size + 65536); } if(buffer.remaining() >= size) { // 容量の残りが必要量ある場合はそのまま応答 return buffer; } // 必要量ないので、新規にバッファを再生成 ByteBuffer newBuffer = ByteBuffer.allocate(buffer.capacity() + size + 65536); buffer.flip(); newBuffer.put(buffer); buffer = newBuffer; return buffer; } /** * すでに保持しているバッファサイズを参照する。 * @return 持っているデータ量 */ protected int getBufferSize() { if(buffer == null) { return 0; } return buffer.position(); } /** * ファイルにデータを書き込む動作 */ @Override public void writeData(String targetFile, boolean append) { try { WritableByteChannel channel = Channels.newChannel(new FileOutputStream(targetFile, append)); buffer.flip(); channel.write(buffer); } catch (Exception e) { e.printStackTrace(); } } /** * パケットの長さ設定 * @param duration */ protected void setDuration(float duration) { this.duration = duration; } /** * パケットの長さ取得 */ @Override public float getDuration() { return duration; } /** * {@inheritDoc} */ @Override public byte[] getRawData() { buffer.flip(); byte[] data = new byte[buffer.limit()]; buffer.get(data); return data; } }