Changeset 386
- Timestamp:
- Oct 6, 2008, 10:00:13 PM (17 years ago)
- Location:
- GPL/branches/uniaud32-2.0
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
GPL/branches/uniaud32-2.0/drv32/idc.c
r265 r386 137 137 } 138 138 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: 140 148 return OSS32_WaveSetVolume(pPacket->streamid, pPacket->setwavevol.volume); 141 149 -
GPL/branches/uniaud32-2.0/include/ossidc.h
r265 r386 39 39 40 40 //IDC communication packet 41 typedef struct 41 typedef struct 42 42 { 43 43 OSSSTREAMID streamid; //IN: stream id … … 164 164 #define IDC32_WAVE_GETPOS 0x1B 165 165 #define IDC32_WAVE_SETVOLUME 0x1C 166 #define IDC32_WAVE_GETHWPTR 0x1D 166 167 167 168 #define IDC32_MIXER_OPEN 0x20 … … 278 279 279 280 280 typedef struct 281 typedef struct 281 282 { 282 283 char name[SIZE_DEVICE_NAME]; … … 287 288 288 289 #define SIZE_DEVICE_NAME 32 289 typedef struct 290 typedef struct 290 291 { 291 292 ULONG nrchannels; … … 367 368 typedef struct { 368 369 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 371 372 ULONG ulChanFlags; //channel flags 372 373 ULONG ulMinRate; //min sample rate -
GPL/branches/uniaud32-2.0/include/ossidc32.h
r265 r386 58 58 OSSRET OSS32_WaveGetPosition(OSSSTREAMID streamid, ULONG *pPosition); 59 59 OSSRET OSS32_WaveGetSpace(OSSSTREAMID streamid, ULONG *pBytesAvail); 60 OSSRET OSS32_WaveGetHwPtr(OSSSTREAMID streamid, ULONG *pBytesAvail); 60 61 OSSRET OSS32_WaveSetVolume(OSSSTREAMID streamid, ULONG volume); 61 62 -
GPL/branches/uniaud32-2.0/lib32/sound.c
r377 r386 204 204 int ALSAToOSSDataType(ULONG ALSADataType) 205 205 { 206 switch(ALSADataType) 206 switch(ALSADataType) 207 207 { 208 208 case SNDRV_PCM_FORMAT_S8: … … 339 339 340 340 //query wave in & out caps 341 for(i=0;i<2;i++) 341 for(i=0;i<2;i++) 342 342 { 343 343 PWAVE_CAPS pWaveCaps = (i == 0) ? &pDevCaps->waveOutCaps : &pDevCaps->waveInCaps; 344 344 345 345 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) 347 347 { 348 348 printk("OSS32_QueryDevCaps: wave open error %i\n", ret); … … 358 358 //set operation to non-blocking 359 359 pHandle->file.f_flags = O_NONBLOCK; 360 360 361 361 ret = pHandle->file.f_op->ioctl(&pHandle->inode, &pHandle->file, SNDRV_PCM_IOCTL_INFO, (ULONG)pcminfo); 362 362 if(ret != 0) { … … 373 373 printk("Device name: %s", pDevCaps->szDeviceName); 374 374 pWaveCaps->nrStreams = pcminfo->subdevices_count; 375 375 376 376 //get all hardware parameters 377 377 _snd_pcm_hw_params_any(params); … … 405 405 406 406 pWaveCaps->ulRateFlags = mask->bits[0]; 407 407 408 408 pWaveCaps->ulRateFlags = ALSAToOSSRateFlags(pWaveCaps->ulRateFlags); 409 409 … … 412 412 mask = hw_param_mask(params, SNDRV_PCM_HW_PARAM_FORMAT); 413 413 format_mask = mask->bits[0]; 414 for(fmt=0;fmt<32;fmt++) 414 for(fmt=0;fmt<32;fmt++) 415 415 { 416 if(format_mask & (1 << fmt)) 416 if(format_mask & (1 << fmt)) 417 417 { 418 418 int f = ALSAToOSSDataType(fmt); … … 428 428 429 429 //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) 431 431 { 432 432 pDevCaps->ulCaps |= OSS32_CAPS_MPU401_PLAYBACK; … … 434 434 streamid = 0; 435 435 } 436 if(OSS32_MidiOpen(deviceid, OSS32_STREAM_MPU401_MIDIIN, &streamid) == OSSERR_SUCCESS) 436 if(OSS32_MidiOpen(deviceid, OSS32_STREAM_MPU401_MIDIIN, &streamid) == OSSERR_SUCCESS) 437 437 { 438 438 pDevCaps->ulCaps |= OSS32_CAPS_MPU401_CAPTURE; … … 440 440 streamid = 0; 441 441 } 442 if(OSS32_MidiOpen(deviceid, OSS32_STREAM_FM_MIDIOUT, &streamid) == OSSERR_SUCCESS) 442 if(OSS32_MidiOpen(deviceid, OSS32_STREAM_FM_MIDIOUT, &streamid) == OSSERR_SUCCESS) 443 443 { 444 444 pDevCaps->ulCaps |= OSS32_CAPS_FMSYNTH_PLAYBACK; … … 446 446 streamid = 0; 447 447 } 448 if(OSS32_MidiOpen(deviceid, OSS32_STREAM_WAVETABLE_MIDIOUT, &streamid) == OSSERR_SUCCESS) 448 if(OSS32_MidiOpen(deviceid, OSS32_STREAM_WAVETABLE_MIDIOUT, &streamid) == OSSERR_SUCCESS) 449 449 { 450 450 pDevCaps->ulCaps |= OSS32_CAPS_WAVETABLE_PLAYBACK; … … 772 772 BOOL fTryAgain = FALSE; 773 773 ULONG ulMinRate, ulMaxRate; 774 774 775 775 if(pHandle == NULL || pHandle->magic != MAGIC_WAVE_ALSA32) { 776 776 … … 822 822 //get all hardware parameters 823 823 _snd_pcm_hw_params_any(¶ms); 824 _snd_pcm_hw_param_set(¶ms, SNDRV_PCM_HW_PARAM_ACCESS, 824 _snd_pcm_hw_param_set(¶ms, SNDRV_PCM_HW_PARAM_ACCESS, 825 825 SNDRV_PCM_ACCESS_RW_INTERLEAVED, 0); 826 _snd_pcm_hw_param_set(¶ms, SNDRV_PCM_HW_PARAM_FORMAT, 826 _snd_pcm_hw_param_set(¶ms, SNDRV_PCM_HW_PARAM_FORMAT, 827 827 OSSToALSADataType[pHwParams->ulDataType], 0); 828 828 ret = pHandle->file.f_op->ioctl(&pHandle->inode, &pHandle->file, SNDRV_PCM_IOCTL_HW_REFINE, (ULONG)__Stack32ToFlat(¶ms)); … … 859 859 ret = pHandle->file.f_op->ioctl(&pHandle->inode, &pHandle->file, SNDRV_PCM_IOCTL_HW_REFINE, (ULONG)__Stack32ToFlat(¶ms)); 860 860 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, 863 863 pHwParams->ulBitsPerSample, 864 864 OSSToALSADataType[pHwParams->ulDataType], … … 974 974 _snd_pcm_hw_param_set(¶ms, SNDRV_PCM_HW_PARAM_RATE, 975 975 pHwParams->ulSampleRate, 0); 976 _snd_pcm_hw_param_set(¶ms, SNDRV_PCM_HW_PARAM_PERIOD_SIZE, 976 _snd_pcm_hw_param_set(¶ms, SNDRV_PCM_HW_PARAM_PERIOD_SIZE, 977 977 periodsize, 0); 978 _snd_pcm_hw_param_set(¶ms, SNDRV_PCM_HW_PARAM_PERIOD_BYTES, 978 _snd_pcm_hw_param_set(¶ms, SNDRV_PCM_HW_PARAM_PERIOD_BYTES, 979 979 periodbytes, 0); 980 _snd_pcm_hw_param_set(¶ms, SNDRV_PCM_HW_PARAM_PERIODS, 980 _snd_pcm_hw_param_set(¶ms, SNDRV_PCM_HW_PARAM_PERIODS, 981 981 nrperiods, 0); 982 _snd_pcm_hw_param_set(¶ms, SNDRV_PCM_HW_PARAM_BUFFER_SIZE, 982 _snd_pcm_hw_param_set(¶ms, SNDRV_PCM_HW_PARAM_BUFFER_SIZE, 983 983 periodsize*nrperiods, 0); 984 _snd_pcm_hw_param_set(¶ms, SNDRV_PCM_HW_PARAM_BUFFER_BYTES, 984 _snd_pcm_hw_param_set(¶ms, SNDRV_PCM_HW_PARAM_BUFFER_BYTES, 985 985 periodbytes*nrperiods, 0); 986 986 987 987 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", 989 989 pHwParams->ulSampleRate, pHwParams->ulBitsPerSample, pHwParams->ulNumChannels, periodsize, nrperiods)); 990 990 … … 1016 1016 1017 1017 //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) 1019 1019 { 1020 1020 swparams.avail_min = periodsize; … … 1104 1104 #endif 1105 1105 1106 if (size == 0) 1106 if (size == 0) 1107 1107 { 1108 1108 #ifdef DEBUG_PK … … 1124 1124 // size should be aligned to channels number * samplesize //PS+++ what is it and why?!?!?! 1125 1125 j = 10; // 10 try if error 1126 while (size && j && ret) 1126 while (size && j && ret) 1127 1127 { 1128 1128 for (i=0; i < 1000; i++) … … 1132 1132 if ((status.state != SNDRV_PCM_STATE_XRUN ) && samples_to_bytes(status.avail) ) 1133 1133 break; 1134 if (i > 998) 1134 if (i > 998) 1135 1135 { 1136 1136 // 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)); … … 1147 1147 ret = pHandle->file.f_op->write(&pHandle->file, (char *)buffer, size, &pHandle->file.f_pos); 1148 1148 1149 if (ret < 0 ) 1149 if (ret < 0 ) 1150 1150 { // We have any error, don't try more 1151 1151 j--; … … 1153 1153 ret1 = pHandle->file.f_op->ioctl(&pHandle->inode, &pHandle->file, SNDRV_PCM_IOCTL_PREPARE, 0); 1154 1154 // printk("Error ret:%i ret1:%i trans: %d need %d tot:%d\n",ret,ret1,transferred, size,size1); 1155 continue; 1155 continue; 1156 1156 } 1157 1157 if (ret == 0) continue; … … 1252 1252 //****************************************************************************** 1253 1253 //****************************************************************************** 1254 OSSRET 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 //****************************************************************************** 1254 1288 OSSRET OSS32_WaveSetVolume(OSSSTREAMID streamid, ULONG volume) 1255 1289 {
Note:
See TracChangeset
for help on using the changeset viewer.