int MediaEngine::getAudioSamples(u8* buffer) { if (!m_demux) { return 0; } u8* audioStream = 0; int audioSize = m_demux->getaudioStream(&audioStream); if (m_audioPos >= audioSize || !isHeader(audioStream, m_audioPos)) { return 0; } u8 headerCode1 = audioStream[2]; u8 headerCode2 = audioStream[3]; int frameSize = ((headerCode1 & 0x03) << 8) | (headerCode2 & 0xFF) * 8 + 0x10; if (m_audioPos + frameSize > audioSize) return 0; m_audioPos += 8; int nextHeader = getNextHeaderPosition(audioStream, m_audioPos, audioSize, frameSize); u8* frame = audioStream + m_audioPos; int outbytes = 0; Atrac3plus_Decoder::Decode(m_audioContext, frame, frameSize - 8, &outbytes, buffer); if (headerCode1 == 0x24) { // it a mono atrac3plus, convert it to stereo s16 *outbuf = (s16*)buffer; s16 *inbuf = (s16*)buffer; for (int i = 0x800 - 1; i >= 0; i--) { s16 sample = inbuf[i]; outbuf[i * 2] = sample; outbuf[i * 2 + 1] = sample; } } if (nextHeader >= 0) { m_audioPos = nextHeader; } else m_audioPos = audioSize; m_audiopts += 4180; return outbytes; }
int convertStreamtoOMA(u8* audioStream, int audioSize, u8** outputStream) { if (!isHeader(audioStream, 0)) { *outputStream = 0; return 0; } u8 headerCode1 = audioStream[2]; u8 headerCode2 = audioStream[3]; if (headerCode1 == 0x28) { bool bsupported = false; for (int i = 0; i < atrac3plusradiosize; i++) { if (atrac3plusradio[i] == headerCode2) { bsupported = true; break; } } if (bsupported == false) { *outputStream = 0; return 0; } } else { *outputStream = 0; return 0; } int frameSize = ((headerCode1 & 0x03) << 8) | (headerCode2 & 0xFF) * 8 + 0x10; int numCompleteFrames = audioSize / (frameSize + 8); int lastFrameSize = audioSize - (numCompleteFrames * (frameSize + 8)); int omaStreamSize = OMAHeaderSize + numCompleteFrames * frameSize + lastFrameSize; // Allocate an OMA stream size large enough (better too large than too short) if (audioSize > omaStreamSize) omaStreamSize = audioSize; u8* oma = new u8[omaStreamSize]; int omapos = 0; int audiopos = 0; omapos += getOmaHeader(OMA_CODECID_ATRAC3P, 0, headerCode1, headerCode2, oma); while (audioSize - audiopos > 8) { // Skip 8 bytes frame header audiopos += 8; int nextHeader = getNextHeaderPosition(audioStream, audiopos, audioSize, frameSize); u8* frame = audioStream + audiopos; int framelimit = audioSize - audiopos; if (nextHeader >= 0) { framelimit = nextHeader - audiopos; audiopos = nextHeader; } else audiopos = audioSize; WriteBuf(oma, omapos, frame, framelimit); } *outputStream = oma; return omapos; }