/[pcsx2_0.9.7]/trunk/3rdparty/portaudio/src/hostapi/wasapi/pa_win_wasapi.c
ViewVC logotype

Diff of /trunk/3rdparty/portaudio/src/hostapi/wasapi/pa_win_wasapi.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 31 by william, Tue Sep 7 03:24:11 2010 UTC revision 62 by william, Tue Sep 7 11:08:22 2010 UTC
# Line 58  Line 58 
58          #include <functiondiscoverykeys.h>          #include <functiondiscoverykeys.h>
59          #undef INITGUID          #undef INITGUID
60  #endif  #endif
61    #ifndef __MWERKS__
62    #include <malloc.h>
63    #include <memory.h>
64    #endif /* __MWERKS__ */
65    
66  #include "pa_util.h"  #include "pa_util.h"
67  #include "pa_allocation.h"  #include "pa_allocation.h"
# Line 2741  static PaError ReadStream( PaStream* s, Line 2745  static PaError ReadStream( PaStream* s,
2745    
2746          HRESULT hr = S_OK;          HRESULT hr = S_OK;
2747          UINT32 frames;          UINT32 frames;
2748          BYTE *buffer = (BYTE *)_buffer;          BYTE *user_buffer = (BYTE *)_buffer;
2749          BYTE *data = NULL;          BYTE *wasapi_buffer = NULL;
2750          DWORD flags = 0;          DWORD flags = 0;
2751          UINT32 buffer_size;          UINT32 i;
2752    
2753          // validate          // validate
2754          if (!stream->running)          if (!stream->running)
# Line 2755  static PaError ReadStream( PaStream* s, Line 2759  static PaError ReadStream( PaStream* s,
2759          // Notify blocking op has begun          // Notify blocking op has begun
2760          ResetEvent(stream->hBlockingOpStreamRD);          ResetEvent(stream->hBlockingOpStreamRD);
2761    
2762        // make a local copy of the user buffer pointer(s), this is necessary
2763            // because PaUtil_CopyOutput() advances these pointers every time it is called
2764        if (!stream->bufferProcessor.userInputIsInterleaved)
2765        {
2766                    user_buffer = (BYTE *)alloca(sizeof(BYTE *) * stream->bufferProcessor.inputChannelCount);
2767            if (user_buffer == NULL)
2768                return paInsufficientMemory;
2769    
2770            for (i = 0; i < stream->bufferProcessor.inputChannelCount; ++i)
2771                ((BYTE **)user_buffer)[i] = ((BYTE **)_buffer)[i];
2772        }
2773    
2774          while (_frames != 0)          while (_frames != 0)
2775          {          {
2776                    UINT32 processed, processed_size;
2777    
2778                  // Get the available data in the shared buffer.                  // Get the available data in the shared buffer.
2779                  if ((hr = IAudioCaptureClient_GetBuffer(stream->cclient, &data, &frames, &flags, NULL, NULL)) != S_OK)                  if ((hr = IAudioCaptureClient_GetBuffer(stream->cclient, &wasapi_buffer, &frames, &flags, NULL, NULL)) != S_OK)
2780                  {                  {
2781                          if (hr == AUDCLNT_S_BUFFER_EMPTY)                          if (hr == AUDCLNT_S_BUFFER_EMPTY)
2782                          {                          {
# Line 2779  static PaError ReadStream( PaStream* s, Line 2797  static PaError ReadStream( PaStream* s,
2797                  if (frames > _frames)                  if (frames > _frames)
2798                          frames = _frames;                          frames = _frames;
2799    
2800                  // Copy                  // Register available frames to processor
2801                  buffer_size = frames * stream->in.wavex.Format.nBlockAlign;          PaUtil_SetInputFrameCount(&stream->bufferProcessor, frames);
2802                  memcpy(buffer, data, buffer_size);                  
2803                  buffer += buffer_size;                  // Register host buffer pointer to processor
2804            PaUtil_SetInterleavedInputChannels(&stream->bufferProcessor, 0, wasapi_buffer,  stream->bufferProcessor.inputChannelCount);
2805                    
2806                    // Copy user data to host buffer (with conversion if applicable)
2807                    processed = PaUtil_CopyInput(&stream->bufferProcessor, (void **)&user_buffer, frames);
2808    
2809                    // Advance user buffer to consumed portion
2810                    processed_size = processed * stream->in.wavex.Format.nBlockAlign;
2811                    if (stream->bufferProcessor.userInputIsInterleaved)
2812                    {
2813                            user_buffer += processed_size;
2814                    }
2815                    else
2816                    {
2817                            for (i = 0; i < stream->bufferProcessor.inputChannelCount; ++i)
2818                                    ((BYTE **)user_buffer)[i] = ((BYTE **)user_buffer)[i] + processed_size;
2819                    }
2820    
2821                  // Release buffer                  // Release host buffer
2822                  if ((hr = IAudioCaptureClient_ReleaseBuffer(stream->cclient, frames)) != S_OK)                  if ((hr = IAudioCaptureClient_ReleaseBuffer(stream->cclient, processed)) != S_OK)
2823                  {                  {
2824                          LogHostError(hr);                          LogHostError(hr);
2825                          goto stream_rd_end;                          goto stream_rd_end;
2826                  }                  }
2827    
2828                  _frames -= frames;                  _frames -= processed;
2829          }          }
2830    
2831  stream_rd_end:  stream_rd_end:
# Line 2808  static PaError WriteStream( PaStream* s, Line 2842  static PaError WriteStream( PaStream* s,
2842      PaWasapiStream *stream = (PaWasapiStream*)s;      PaWasapiStream *stream = (PaWasapiStream*)s;
2843    
2844          UINT32 frames;          UINT32 frames;
2845          const BYTE *buffer = (BYTE *)_buffer;          const BYTE *user_buffer = (const BYTE *)_buffer;
2846          BYTE *data;          BYTE *wasapi_buffer;
2847          HRESULT hr = S_OK;          HRESULT hr = S_OK;
2848          UINT32 next_rev_sleep, blocks, block_sleep_ms;          UINT32 next_rev_sleep, blocks, block_sleep_ms;
2849          UINT32 i;          UINT32 i;
# Line 2854  static PaError WriteStream( PaStream* s, Line 2888  static PaError WriteStream( PaStream* s,
2888                  Sleep(stream->out.prevSleep);                  Sleep(stream->out.prevSleep);
2889          stream->out.prevSleep = next_rev_sleep;          stream->out.prevSleep = next_rev_sleep;
2890    
2891        // make a local copy of the user buffer pointer(s), this is necessary
2892            // because PaUtil_CopyOutput() advances these pointers every time it is called
2893        if (!stream->bufferProcessor.userOutputIsInterleaved)
2894        {
2895            user_buffer = (const BYTE *)alloca(sizeof(const BYTE *) * stream->bufferProcessor.outputChannelCount);
2896            if (user_buffer == NULL)
2897                return paInsufficientMemory;
2898    
2899            for (i = 0; i < stream->bufferProcessor.outputChannelCount; ++i)
2900                ((const BYTE **)user_buffer)[i] = ((const BYTE **)_buffer)[i];
2901        }
2902    
2903          // Feed engine          // Feed engine
2904          for (i = 0; i < blocks; ++i)          for (i = 0; i < blocks; ++i)
2905          {          {
2906                  UINT32 available;                  UINT32 available, processed;
                 UINT32 buffer_size;  
2907    
2908                  // Get block frames                  // Get block frames
2909                  frames = stream->out.framesPerHostCallback;                  frames = stream->out.framesPerHostCallback;
# Line 2871  static PaError WriteStream( PaStream* s, Line 2916  static PaError WriteStream( PaStream* s,
2916                  while (frames != 0)                  while (frames != 0)
2917                  {                  {
2918                          UINT32 padding = 0;                          UINT32 padding = 0;
2919                            UINT32 processed_size;
2920    
2921                          // Check if blocking call must be interrupted                          // Check if blocking call must be interrupted
2922                          if (WaitForSingleObject(stream->hCloseRequest, 0) != WAIT_TIMEOUT)                          if (WaitForSingleObject(stream->hCloseRequest, 0) != WAIT_TIMEOUT)
# Line 2884  static PaError WriteStream( PaStream* s, Line 2930  static PaError WriteStream( PaStream* s,
2930                                  goto stream_wr_end;                                  goto stream_wr_end;
2931                          }                          }
2932    
2933                          // Get frames available                          // Calculate frames available
2934                          if (frames >= padding)                          if (frames >= padding)
2935                                  available = frames - padding;                                  available = frames - padding;
2936                          else                          else
2937                                  available = frames;                                  available = frames;
2938    
2939                          // Get buffer                          // Get pointer to host buffer
2940                          if ((hr = IAudioRenderClient_GetBuffer(stream->rclient, available, &data)) != S_OK)                          if ((hr = IAudioRenderClient_GetBuffer(stream->rclient, available, &wasapi_buffer)) != S_OK)
2941                          {                          {
2942                                  // Buffer size is too big, waiting                                  // Buffer size is too big, waiting
2943                                  if (hr == AUDCLNT_E_BUFFER_TOO_LARGE)                                  if (hr == AUDCLNT_E_BUFFER_TOO_LARGE)
# Line 2900  static PaError WriteStream( PaStream* s, Line 2946  static PaError WriteStream( PaStream* s,
2946                                  goto stream_wr_end;                                  goto stream_wr_end;
2947                          }                          }
2948    
2949                          // Copy                          // Register available frames to processor
2950                          buffer_size = available * stream->out.wavex.Format.nBlockAlign;              PaUtil_SetOutputFrameCount(&stream->bufferProcessor, available);
2951                          memcpy(data, buffer, buffer_size);                          
2952                          buffer += buffer_size;                          // Register host buffer pointer to processor
2953                PaUtil_SetInterleavedOutputChannels(&stream->bufferProcessor, 0, wasapi_buffer,     stream->bufferProcessor.outputChannelCount);
2954                            
2955                            // Copy user data to host buffer (with conversion if applicable)
2956                            processed = PaUtil_CopyOutput(&stream->bufferProcessor, (const void **)&user_buffer, available);
2957    
2958                            // Advance user buffer to consumed portion
2959                            processed_size = processed * stream->out.wavex.Format.nBlockAlign;
2960                            if (stream->bufferProcessor.userOutputIsInterleaved)
2961                            {
2962                                    user_buffer += processed_size;
2963                            }
2964                            else
2965                            {
2966                                    for (i = 0; i < stream->bufferProcessor.outputChannelCount; ++i)
2967                                            ((const BYTE **)user_buffer)[i] = ((const BYTE **)user_buffer)[i] + processed_size;
2968                            }
2969    
2970                          // Release buffer                          // Release host buffer
2971                          if ((hr = IAudioRenderClient_ReleaseBuffer(stream->rclient, available, 0)) != S_OK)                          if ((hr = IAudioRenderClient_ReleaseBuffer(stream->rclient, processed, 0)) != S_OK)
2972                          {                          {
2973                                  LogHostError(hr);                                  LogHostError(hr);
2974                                  goto stream_wr_end;                                  goto stream_wr_end;
2975                          }                          }
2976    
2977                          frames -= available;                          // Deduct frames
2978                            frames -= processed;
2979                  }                  }
2980    
2981                  _frames -= frames;                  _frames -= frames;

Legend:
Removed from v.31  
changed lines
  Added in v.62

  ViewVC Help
Powered by ViewVC 1.1.22