2012-09-22 28 views
5

मैं कुछ सी # विंडोज फोन पोर्टिंग कर रहा हूँ में एक उत्पन्न बफर से एक ध्वनि बजाना एक बफर से मनमाने ढंग से लगता है खेलने के लिए एक XNA SoundEffect इस्तेमाल किया। सबसे सरल मामलों में मैं केवल आवश्यक अवधि और आवृत्ति की साइन लहर बनाउंगा। अवधि और आवृत्ति दोनों अलग-अलग हो सकती हैं, इसलिए मैं MediaElements पर भरोसा नहीं करना चाहूंगा (जब तक कि बेस फ़ाइल की आवृत्ति को स्थानांतरित करने के लिए कोई रास्ता नहीं है, लेकिन यह केवल एक आवृत्ति पीढ़ी के साथ मेरी मदद करेगा)।Windows 8</p> <p>फोन क्षुधा के लिए खत्म 7 एप्लिकेशन को Windows 8 एप्लिकेशन

WinRT में XNA SoundEffectInstance के बराबर क्या है?

मुझे लगता है कि मुझे इसके लिए डायरेक्टएक्स का उपयोग करने की आवश्यकता होगी, लेकिन मुझे यकीन नहीं है कि अन्यथा सी #/एक्सएएमएल ऐप से इस बारे में कैसे जाना है। मैंने SharpDX पर एक नज़र डाली है, लेकिन ऐसा लगता है कि डायरेक्टसाउंड, सेकेंडरी बफर, माध्यमिक बफर वर्ग नहीं है जो मुझे लगता है कि मुझे उपयोग करने की आवश्यकता होगी।

मैंने ऊपर कई धारणाएं की हैं। हो सकता है कि मैं गलत वर्गों की तलाश कर रहा हूं या विंडोज 8 ऐप से मनमाने ढंग से ध्वनि उत्पन्न करने का एक बिल्कुल अलग तरीका है।


मुझे an example using XAudio2 from SharpDX to play a wav file via an AudioBuffer मिला। यह आशाजनक प्रतीत होता है, मुझे मूल फ़ाइल स्ट्रीम के लिए अपने जेनरेट किए गए ऑडियो बफर को प्रतिस्थापित करने की आवश्यकता होगी।

PM> इंस्टॉल करें-पैकेज SharpDX

PM> इंस्टॉल करें-पैकेज SharpDX.XAudio2

public void PlaySound() 
    { 
     XAudio2 xaudio; 
     MasteringVoice masteringVoice; 

     xaudio = new XAudio2(); 
     masteringVoice = new MasteringVoice(xaudio); 

     var nativefilestream = new NativeFileStream(
      @"Assets\SpeechOn.wav", 
      NativeFileMode.Open, 
      NativeFileAccess.Read, 
      NativeFileShare.Read); 

     var soundstream = new SoundStream(nativefilestream); 


     var waveFormat = soundstream.Format; 
     var buffer = new AudioBuffer 
     { 
      Stream = soundstream.ToDataStream(), 
      AudioBytes = (int)soundstream.Length, 
      Flags = BufferFlags.EndOfStream 
     }; 

     var sourceVoice = new SourceVoice(xaudio, waveFormat, true); 

     // There is also support for shifting the frequency. 
     sourceVoice.SetFrequencyRatio(0.5f); 

     sourceVoice.SubmitSourceBuffer(buffer, soundstream.DecodedPacketsInfo); 

     sourceVoice.Start(); 
    } 
+0

मैं ऐसे समाधान की तलाश में हूं जहां मुझे सीधे विंडोज फोन 8 में बफर्ड ऑडियो पैकेट से ऑडियो चलाने में सक्षम होना चाहिए? क्या आप एक कामकाजी उदाहरण पर रीडायरेक्ट कर सकते हैं। – sunder

उत्तर

8

एक ही रास्ता Win8RT में गतिशील ध्वनि उत्पन्न करने के लिए तो आप चाहिए, XAudio2 उपयोग करने के लिए है SharpDX.XAudio2 के साथ ऐसा करने में सक्षम हो।

नेटफाइलफ्रीम का उपयोग करने के बजाय, बस अपने प्रबंधित बफर को सीधे डेटास्ट्रीम को तुरंत चालू करें (या आप एक अप्रबंधित बफर का उपयोग कर सकते हैं या डेटास्ट्रीम को आपके लिए तुरंत चालू कर सकते हैं)। कोड इस तरह होगा:

// Initialization phase, keep this buffer during the life of your application 
// Allocate 10s at 44.1Khz of stereo 16bit signals 
var myBufferOfSamples = new short[44100 * 10 * 2]; 

// Create a DataStream with pinned managed buffer 
var dataStream = DataStream.Create(myBufferOfSamples, true, true); 

var buffer = new AudioBuffer 
     { 
      Stream = dataStream, 
      AudioBytes = (int)dataStream.Length, 
      Flags = BufferFlags.EndOfStream 
     }; 

//... 
// Fill myBufferOfSamples 
//... 

// PCM 44.1Khz stereo 16 bit format 
var waveFormat = new WaveFormat(); 

XAudio2 xaudio = new XAudio2(); 
MasteringVoice masteringVoice = new MasteringVoice(xaudio); 
var sourceVoice = new SourceVoice(xaudio, waveFormat, true); 

// Submit the buffer 
sourceVoice.SubmitSourceBuffer(buffer, null); 

// Start playing 
sourceVoice.Start(); 

नमूना विधि एक साइन लहर के साथ बफर को भरने के लिए:

private void FillBuffer(short[] buffer, int sampleRate, double frequency) 
    { 
     double totalTime = 0; 

     for (int i = 0; i < buffer.Length - 1; i += 2) 
     { 
      double time = (double)totalTime/(double)sampleRate; 
      short currentSample = (short)(Math.Sin(2 * Math.PI * frequency * time) * (double)short.MaxValue); 

      buffer[i] = currentSample; //(short)(currentSample & 0xFF); 
      buffer[i + 1] = currentSample; //(short)(currentSample >> 8); 

      totalTime += 2; 
     } 

    } 
+0

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

+0

जब मैं एक्सएनए में काम कर रहा था तो मेरी फिलबफर विधि एक बाइट [] को पॉप्युलेट करने के लिए प्रयुक्त होती थी। Bitwise को हटा रहा है और शिफ्ट दाएं >> ऑपरेटरों ने इस मुद्दे को ठीक किया है।अब मुझे एक स्पष्ट स्वर उत्पन्न हुआ है। –

+0

इसमें एक बग है: 'कुलटाइम + = 2' का अर्थ है कि यह आवृत्ति से दोगुना कुछ उत्पन्न कर रहा है। यह 'कुल समय ++ होना चाहिए। (इसे स्वयं परीक्षण किया!) –

3

तुम भी WinRT में गतिशील रूप से निर्मित ध्वनि बफ़र्स खेलने के लिए WASAPI उपयोग कर सकते हैं। (xaudio2 एकमात्र समाधान नहीं है)।

मैं यहाँ वीबी में इसके लिए नमूना कोड लिखा था (सी # मूलतः एक ही हो जाएगा): http://www.codeproject.com/Articles/460145/Recording-and-playing-PCM-audio-on-Windows-8-VB

मुझे विश्वास है कि NAudio पुरुष अनुवाद करने के लिए + एक Win8 के लिए, NAudio में मेरी नमूना कोड को शामिल योजना बना रहा है समर्थित संस्करण, ताकि उपयोग करना आसान हो जाएगा।

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

  • कोई संबंधित समस्या नहीं^_^