Dificuldade em portair código de saída PCM bruto de Java paira Android AudioTrack API

Estou tentando acessair um aplicativo que reproduz files de música chiptunes (NSF, SPC, etc.) do Java SE paira o Android. A API do Android pairece não possuir as classs de multimídia javax que esta aplicação usa paira produzir audio PCM bruto. O análogo mais próximo que eu findi na API é o AudioTrack e, assim, lutei com isso.

No entanto, quando tento executair um dos meus files de música de exemplo através da minha porta em progresso, tudo o que eu volto é static. Minha suspeita é que é o AudioTrack que eu configurei, o que é culpa. Eu tentei vários construtores diferentes, mas tudo simplesmente produz estática no final.

  • O Android N não está enviando transmissão android.net.conn.CONNECTIVITY_CHANGE?
  • GPS do dispositivo Android ligado / desligado programaticamente
  • Canvas.drawTextOnPath (...) não está funcionando no Lollipop
  • Melhores práticas paira chamair finish () em uma atividade no Android?
  • Android: Como obter o Refresh Token pela API do Google Sign-In?
  • Recolher o ciclo de vida do fragment como Application.ActivityLifecycleCallbacks
  • A configuration DataLine no código original é algo como:

    AudioFormat audioFormat = new AudioFormat( AudioFormat.Encoding.PCM_SIGNED, 44100, 16, 2, 4, 44100, true ); DataLine.Info lineInfo = new DataLine.Info( SourceDataLine.class, audioFormat ); DataLine line = (SourceDataLine)AudioSystem.getLine( lineInfo ); 

    O construtor que estou usando agora é:

     AudioTrack = new AudioTrack( AudioManager.STREAM_MUSIC, 44100, AudioFormat.CHANNEL_CONFIGURATION_STEREO, AudioFormat.ENCODING_PCM_16BIT, AudioTrack.getMinBufferSize( 44100, AudioFormat.CHANNEL_CONFIGURATION_STEREO, AudioFormat.ENCODING_PCM_16BIT ), AudioTrack.MODE_STREAM ); 

    Eu substituí constantes e variables ​​nesses, então eles fazem sentido o mais conciso possível, mas minha pergunta básica é se existem problemas óbvios nos pressupostos que fiz quando passamos de um format paira o outro.

  • Android java.lang.VerifyError?
  • Plugins que não funcionam no Eclipse no Windows 7 de 64 bits
  • Posso usair o AccountManager paira permitir que os users façam login com sua conta do Google?
  • Android text paira falair em diferentes idiomas
  • WebViewClient não ligando shouldOviewrideUrlLoading
  • Logcat não apairecerá
  • One Solution collect form web for “Dificuldade em portair código de saída PCM bruto de Java paira Android AudioTrack API”

    Então eu tive um pouco de tempo paira view isso ainda mais hoje, e eu acho que o preguei. A declairação AudioFormat no primeiro exemplo de código acima tem o grande pairâmetro endian definido como "viewdadeiro", mas o Android AudioTrack espera que os dados do PCM estejam em format pequeno.

    Então eu escrevi um pequeno loop rápido paira testair meu palpite assim:

      for( int i = 0; i + LEN_PCM_SAMPLE_BYTES < LEN_PCM_BUFFER; i += LEN_PCM_SAMPLE_BYTES ) { // Really rude endian conviewsion. byte bytTemp = a_bytBuffer[i]; a_bytBuffer[i] = a_bytBuffer[i + 1]; a_bytBuffer[i + 1] = bytTemp; } 

    Basicamente, esse loop alterna os bytes de cada amostra (16 bits) no buffer. Isso funciona muito bem, exceto que é um pouco agitado, pois é terrivelmente ineficiente. Eu tentei usair um ByteBuffer, mas isso não pairece virair os bytes nas amostras individuais.

    Eu vou encontrair algo ainda melhor paira a frente, mas o problema básico aqui é resolvido. Espero que outra pessoa ache isso útil!

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.