2010-04-25 15 views
8

से कच्चे पीसीएम आउटपुट कोड को पोर्ट करने में कठिनाई मैं जावा एसई से एंड्रॉइड तक चिपट्यून्स (एनएसएफ, एसपीसी, आदि) संगीत फ़ाइलों को चलाने वाले एप्लिकेशन को बंद करने का प्रयास कर रहा हूं। एंड्रॉइड एपीआई में जैवैक्स मल्टीमीडिया कक्षाओं की कमी है, जो यह एप्लिकेशन कच्चे पीसीएम ऑडियो आउटपुट के लिए उपयोग करता है। एपीआई में मैंने पाया सबसे नज़दीकी एनालॉग ऑडियोट्रैक है और इसलिए मैं इसके साथ कुश्ती कर रहा हूं।जावा से एंड्रॉइड ऑडियोट्रैक एपीआई

हालांकि, जब मैं अपने पोर्ट-इन-प्रोग्रेस के माध्यम से अपनी नमूना संगीत फ़ाइलों में से किसी एक को चलाने का प्रयास करता हूं, तो मुझे वापस मिलना स्थिर होता है। मेरा संदेह यह है कि यह ऑडियोट्रैक है जिसे मैंने सेटअप किया है जो गलती है। मैंने विभिन्न विभिन्न रचनाकारों की कोशिश की है, लेकिन यह सब अंत में स्थिर है।

मूल कोड में DATALINE सेटअप है कुछ की तरह:

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); 

निर्माता मैं अभी उपयोग कर रहा हूँ है:

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); 

मैं उन में स्थिरांक और चर बदल दिया है ताकि वे जितना संभव हो सके समझदारी से समझें, लेकिन मेरा मूल प्रश्न यह है कि यदि एक प्रारूप से दूसरे प्रारूप में जाने पर धारणाओं में कोई स्पष्ट समस्या है।

+0

भले ही आप स्थैतिक हो रहे हों, क्या आपने यह देखने के लिए जांच की है कि ट्रैक की लंबाई सही है या नहीं? – nvuono

+0

प्रश्न में संगीत फ़ाइलों में वास्तव में एक निश्चित ट्रैक लंबाई नहीं है। यही है, वे एक डीएसपी के लिए कोड के रूप में हैं जो अभी तक एक लूप खेलना जारी रखता है जब तक उन्हें रोकने के लिए कहा जाता है। – alexanderfb

उत्तर

7

तो मेरे पास आज और इसे देखने के लिए थोड़ा समय था, और मुझे लगता है कि मैंने इसे कम कर दिया है। उपरोक्त पहले कोड नमूने में ऑडियोफॉर्मेट घोषणा में "एंड" पर सेट किया गया बड़ा एंडियन पैरामीटर है, लेकिन एंड्रॉइड ऑडियोट्रैक पीसीएम डेटा को छोटे एंडियन प्रारूप में होने की उम्मीद करता है।

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

मूलतः, यह पाश बफर में हर (16-बिट) नमूने के बाइट्स flips:

तो मैं तो जैसे मेरी कूबड़ बाहर का परीक्षण करने के लिए एक त्वरित छोटे से पाश लिखा था। यह बहुत अच्छा काम करता है, सिवाय इसके कि यह थोड़ा अचूक है क्योंकि यह बहुत अक्षम है। मैंने बाइटबफर का उपयोग करने की कोशिश की लेकिन यह अलग-अलग नमूनों में बाइट्स को फ़्लिप नहीं लग रहा है।

मैं आगे बढ़ने के लिए कुछ और बेहतर समझूंगा, लेकिन यहां मूल समस्या हल हो गई है। आशा है कि किसी और को यह उपयोगी लगेगा!

+0

क्या आप चापलूसी के लिए कुछ समझने में सक्षम थे? – StackOverflowed

संबंधित मुद्दे