Changeset 386

Show
Ignore:
Timestamp:
10/06/08 22:00:13 (8 weeks ago)
Author:
rjerant
Message:

Add OSS32_WaveGetHwPtr() to sound.c

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

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{