Changeset 386


Ignore:
Timestamp:
Oct 6, 2008, 10:00:13 PM (17 years ago)
Author:
rjerant
Message:

Add OSS32_WaveGetHwPtr() to sound.c

Location:
GPL/branches/uniaud32-2.0
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • GPL/branches/uniaud32-2.0/drv32/idc.c

    r265 r386  
    137137  }
    138138
    139   case IDC32_WAVE_SETVOLUME:
     139      case IDC32_WAVE_GETHWPTR:
     140  {
     141       ULONG position = 0;
     142       rc = OSS32_WaveGetHwPtr(pPacket->streamid, &position);
     143       pPacket->getpos.position = position;
     144       return rc;
     145  }
     146
     147    case IDC32_WAVE_SETVOLUME:
    140148       return OSS32_WaveSetVolume(pPacket->streamid, pPacket->setwavevol.volume);
    141149
  • GPL/branches/uniaud32-2.0/include/ossidc.h

    r265 r386  
    3939
    4040//IDC communication packet
    41 typedef struct 
     41typedef struct
    4242{
    4343  OSSSTREAMID streamid; //IN:  stream id
     
    164164#define IDC32_WAVE_GETPOS               0x1B
    165165#define IDC32_WAVE_SETVOLUME            0x1C
     166#define IDC32_WAVE_GETHWPTR             0x1D
    166167
    167168#define IDC32_MIXER_OPEN                0x20
     
    278279
    279280
    280 typedef struct 
     281typedef struct
    281282{
    282283    char  name[SIZE_DEVICE_NAME];
     
    287288
    288289#define SIZE_DEVICE_NAME            32
    289 typedef struct 
     290typedef struct
    290291{
    291292    ULONG nrchannels;
     
    367368typedef struct {
    368369    ULONG  nrStreams;            //nr of activate wave streams supported
    369     ULONG  ulMinChannels;        //min nr of channels 
    370     ULONG  ulMaxChannels;        //max nr of channels 
     370    ULONG  ulMinChannels;        //min nr of channels
     371    ULONG  ulMaxChannels;        //max nr of channels
    371372    ULONG  ulChanFlags;          //channel flags
    372373    ULONG  ulMinRate;            //min sample rate
  • GPL/branches/uniaud32-2.0/include/ossidc32.h

    r265 r386  
    5858OSSRET OSS32_WaveGetPosition(OSSSTREAMID streamid, ULONG *pPosition);
    5959OSSRET OSS32_WaveGetSpace(OSSSTREAMID streamid, ULONG *pBytesAvail);
     60OSSRET OSS32_WaveGetHwPtr(OSSSTREAMID streamid, ULONG *pBytesAvail);
    6061OSSRET OSS32_WaveSetVolume(OSSSTREAMID streamid, ULONG volume);
    6162
  • GPL/branches/uniaud32-2.0/lib32/sound.c

    r377 r386  
    204204int ALSAToOSSDataType(ULONG ALSADataType)
    205205{
    206     switch(ALSADataType) 
     206    switch(ALSADataType)
    207207    {
    208208    case SNDRV_PCM_FORMAT_S8:
     
    339339
    340340    //query wave in & out caps
    341     for(i=0;i<2;i++) 
     341    for(i=0;i<2;i++)
    342342    {
    343343        PWAVE_CAPS pWaveCaps = (i == 0) ? &pDevCaps->waveOutCaps : &pDevCaps->waveInCaps;
    344344
    345345        ret = OSS32_WaveOpen(deviceid, (i == 0) ? OSS32_STREAM_WAVEOUT : OSS32_STREAM_WAVEIN, &streamid, 0, 0);
    346         if(ret != OSSERR_SUCCESS) 
     346        if(ret != OSSERR_SUCCESS)
    347347        {
    348348            printk("OSS32_QueryDevCaps: wave open error %i\n", ret);
     
    358358        //set operation to non-blocking
    359359        pHandle->file.f_flags = O_NONBLOCK;
    360    
     360
    361361        ret = pHandle->file.f_op->ioctl(&pHandle->inode, &pHandle->file, SNDRV_PCM_IOCTL_INFO, (ULONG)pcminfo);
    362362        if(ret != 0) {
     
    373373        printk("Device name: %s", pDevCaps->szDeviceName);
    374374        pWaveCaps->nrStreams = pcminfo->subdevices_count;
    375    
     375
    376376        //get all hardware parameters
    377377        _snd_pcm_hw_params_any(params);
     
    405405
    406406        pWaveCaps->ulRateFlags   = mask->bits[0];
    407  
     407
    408408        pWaveCaps->ulRateFlags   = ALSAToOSSRateFlags(pWaveCaps->ulRateFlags);
    409409
     
    412412        mask = hw_param_mask(params, SNDRV_PCM_HW_PARAM_FORMAT);
    413413        format_mask = mask->bits[0];
    414         for(fmt=0;fmt<32;fmt++) 
     414        for(fmt=0;fmt<32;fmt++)
    415415        {
    416             if(format_mask & (1 << fmt)) 
     416            if(format_mask & (1 << fmt))
    417417            {
    418418                int f = ALSAToOSSDataType(fmt);
     
    428428
    429429    //Check support for MPU401, FM & Wavetable MIDI
    430     if(OSS32_MidiOpen(deviceid, OSS32_STREAM_MPU401_MIDIOUT, &streamid) == OSSERR_SUCCESS) 
     430    if(OSS32_MidiOpen(deviceid, OSS32_STREAM_MPU401_MIDIOUT, &streamid) == OSSERR_SUCCESS)
    431431    {
    432432        pDevCaps->ulCaps |= OSS32_CAPS_MPU401_PLAYBACK;
     
    434434        streamid = 0;
    435435    }
    436     if(OSS32_MidiOpen(deviceid, OSS32_STREAM_MPU401_MIDIIN, &streamid) == OSSERR_SUCCESS) 
     436    if(OSS32_MidiOpen(deviceid, OSS32_STREAM_MPU401_MIDIIN, &streamid) == OSSERR_SUCCESS)
    437437    {
    438438        pDevCaps->ulCaps |= OSS32_CAPS_MPU401_CAPTURE;
     
    440440        streamid = 0;
    441441    }
    442     if(OSS32_MidiOpen(deviceid, OSS32_STREAM_FM_MIDIOUT, &streamid) == OSSERR_SUCCESS) 
     442    if(OSS32_MidiOpen(deviceid, OSS32_STREAM_FM_MIDIOUT, &streamid) == OSSERR_SUCCESS)
    443443    {
    444444        pDevCaps->ulCaps |= OSS32_CAPS_FMSYNTH_PLAYBACK;
     
    446446        streamid = 0;
    447447    }
    448     if(OSS32_MidiOpen(deviceid, OSS32_STREAM_WAVETABLE_MIDIOUT, &streamid) == OSSERR_SUCCESS) 
     448    if(OSS32_MidiOpen(deviceid, OSS32_STREAM_WAVETABLE_MIDIOUT, &streamid) == OSSERR_SUCCESS)
    449449    {
    450450        pDevCaps->ulCaps |= OSS32_CAPS_WAVETABLE_PLAYBACK;
     
    772772    BOOL                fTryAgain = FALSE;
    773773    ULONG ulMinRate, ulMaxRate;
    774          
     774
    775775    if(pHandle == NULL || pHandle->magic != MAGIC_WAVE_ALSA32) {
    776776
     
    822822    //get all hardware parameters
    823823    _snd_pcm_hw_params_any(&params);
    824     _snd_pcm_hw_param_set(&params, SNDRV_PCM_HW_PARAM_ACCESS, 
     824    _snd_pcm_hw_param_set(&params, SNDRV_PCM_HW_PARAM_ACCESS,
    825825                           SNDRV_PCM_ACCESS_RW_INTERLEAVED, 0);
    826     _snd_pcm_hw_param_set(&params, SNDRV_PCM_HW_PARAM_FORMAT, 
     826    _snd_pcm_hw_param_set(&params, SNDRV_PCM_HW_PARAM_FORMAT,
    827827                           OSSToALSADataType[pHwParams->ulDataType], 0);
    828828    ret = pHandle->file.f_op->ioctl(&pHandle->inode, &pHandle->file, SNDRV_PCM_IOCTL_HW_REFINE, (ULONG)__Stack32ToFlat(&params));
     
    859859    ret = pHandle->file.f_op->ioctl(&pHandle->inode, &pHandle->file, SNDRV_PCM_IOCTL_HW_REFINE, (ULONG)__Stack32ToFlat(&params));
    860860    if(ret != 0) {
    861         dprintf(("32_WSetHwPms (first pass) error %d bps:%d fmt: %d ch: %d sr: %d\n", 
    862                   ret, 
     861        dprintf(("32_WSetHwPms (first pass) error %d bps:%d fmt: %d ch: %d sr: %d\n",
     862                  ret,
    863863                  pHwParams->ulBitsPerSample,
    864864                  OSSToALSADataType[pHwParams->ulDataType],
     
    974974    _snd_pcm_hw_param_set(&params, SNDRV_PCM_HW_PARAM_RATE,
    975975                           pHwParams->ulSampleRate, 0);
    976     _snd_pcm_hw_param_set(&params, SNDRV_PCM_HW_PARAM_PERIOD_SIZE, 
     976    _snd_pcm_hw_param_set(&params, SNDRV_PCM_HW_PARAM_PERIOD_SIZE,
    977977                           periodsize, 0);
    978     _snd_pcm_hw_param_set(&params, SNDRV_PCM_HW_PARAM_PERIOD_BYTES, 
     978    _snd_pcm_hw_param_set(&params, SNDRV_PCM_HW_PARAM_PERIOD_BYTES,
    979979                           periodbytes, 0);
    980     _snd_pcm_hw_param_set(&params, SNDRV_PCM_HW_PARAM_PERIODS, 
     980    _snd_pcm_hw_param_set(&params, SNDRV_PCM_HW_PARAM_PERIODS,
    981981                           nrperiods, 0);
    982     _snd_pcm_hw_param_set(&params, SNDRV_PCM_HW_PARAM_BUFFER_SIZE, 
     982    _snd_pcm_hw_param_set(&params, SNDRV_PCM_HW_PARAM_BUFFER_SIZE,
    983983                           periodsize*nrperiods, 0);
    984     _snd_pcm_hw_param_set(&params, SNDRV_PCM_HW_PARAM_BUFFER_BYTES, 
     984    _snd_pcm_hw_param_set(&params, SNDRV_PCM_HW_PARAM_BUFFER_BYTES,
    985985                           periodbytes*nrperiods, 0);
    986986
    987987
    988     dprintf(("HWP: SR rate %ld, BPS %ld, CH %ld, PRSZ %lx, periods %lx", 
     988    dprintf(("HWP: SR rate %ld, BPS %ld, CH %ld, PRSZ %lx, periods %lx",
    989989             pHwParams->ulSampleRate, pHwParams->ulBitsPerSample, pHwParams->ulNumChannels, periodsize, nrperiods));
    990990
     
    10161016
    10171017    //set silence threshold (all sizes in frames) (only needed for playback)
    1018     if(pHandle->file.f_mode == FMODE_WRITE) 
     1018    if(pHandle->file.f_mode == FMODE_WRITE)
    10191019    {
    10201020        swparams.avail_min         = periodsize;
     
    11041104#endif
    11051105
    1106     if (size == 0) 
     1106    if (size == 0)
    11071107    {
    11081108#ifdef DEBUG_PK
     
    11241124        // size should be aligned to channels number * samplesize  //PS+++ what is it and why?!?!?!
    11251125        j = 10;            // 10 try if error
    1126         while (size && j && ret) 
     1126        while (size && j && ret)
    11271127        {
    11281128               for (i=0; i < 1000; i++)
     
    11321132                     if ((status.state != SNDRV_PCM_STATE_XRUN ) && samples_to_bytes(status.avail) )
    11331133                         break;
    1134                      if (i > 998) 
     1134                     if (i > 998)
    11351135                     {
    11361136//                         printk("timeout stat %x avail:%d hw:%d app:%d\n",status.state,samples_to_bytes(status.avail),samples_to_bytes(status.hw_ptr), samples_to_bytes(status.appl_ptr));
     
    11471147               ret = pHandle->file.f_op->write(&pHandle->file, (char *)buffer, size, &pHandle->file.f_pos);
    11481148
    1149                if (ret < 0 ) 
     1149               if (ret < 0 )
    11501150               {  // We have any error, don't try more
    11511151                  j--;
     
    11531153                      ret1 = pHandle->file.f_op->ioctl(&pHandle->inode, &pHandle->file, SNDRV_PCM_IOCTL_PREPARE, 0);
    11541154//                  printk("Error ret:%i ret1:%i trans: %d need %d tot:%d\n",ret,ret1,transferred, size,size1);
    1155                   continue; 
     1155                  continue;
    11561156               }
    11571157               if (ret == 0)  continue;
     
    12521252//******************************************************************************
    12531253//******************************************************************************
     1254OSSRET OSS32_WaveGetHwPtr(ULONG streamid, ULONG *pPosition)
     1255{
     1256    soundhandle        *pHandle = (soundhandle *)streamid;
     1257    struct snd_pcm_status    status;
     1258    int                 ret;
     1259    ULONG               delta;
     1260
     1261    if(pHandle == NULL || pHandle->magic != MAGIC_WAVE_ALSA32) {
     1262        DebugInt3();
     1263        return OSSERR_INVALID_STREAMID;
     1264    }
     1265    if(pPosition == NULL) {
     1266        DebugInt3();
     1267        return OSSERR_INVALID_PARAMETER;
     1268    }
     1269
     1270    //set operation to non-blocking
     1271    pHandle->file.f_flags = O_NONBLOCK;
     1272
     1273    //Get the status of the stream
     1274    ret = pHandle->file.f_op->ioctl(&pHandle->inode, &pHandle->file, SNDRV_PCM_IOCTL_STATUS, (ULONG)__Stack32ToFlat(&status));
     1275
     1276    if(ret) {
     1277        DebugInt3();
     1278        return UNIXToOSSError(ret);
     1279    }
     1280
     1281    dprintf(("OSS32_WaveGetHwPtr: %lx", samples_to_bytes(status.appl_ptr)));
     1282    *pPosition = samples_to_bytes(status.appl_ptr);  //return new hardware position
     1283    return OSSERR_SUCCESS;
     1284}
     1285
     1286//******************************************************************************
     1287//******************************************************************************
    12541288OSSRET OSS32_WaveSetVolume(OSSSTREAMID streamid, ULONG volume)
    12551289{
Note: See TracChangeset for help on using the changeset viewer.