from Greg Crain :

- cleaned up the read code a bit.   There was a chance that bad data 
was left in a buffer after the open device call.
- published the V2 module.   Some audio drivers require it to be there 
( in a R5 system).  This will allow the audio driver to complete 
loading.  If the midi device is opened, a B_ERROR is returned.


git-svn-id: file:///srv/svn/repos/haiku/trunk/current@5416 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Jérôme Duval 2003-11-19 11:47:03 +00:00
parent d3046f7d46
commit a8d1f0c354

View File

@ -144,6 +144,12 @@ midi_open(void * storage, uint32 flags, void ** out_cookie)
dprintf("mpu401:@open: mpu_device->workarounds %d\n",mpu_device->workarounds);
#endif
// the undocumented V2 module is not complete
// we will allow the device to be created since some drivers depend on it
// but will return an error if the actual midi device is opened:
if ( mpu_device->V2 == TRUE)
return (B_ERROR);
switch (mpu_device->workarounds){
case 0:
// don't know the current mpu state
@ -177,6 +183,11 @@ midi_open(void * storage, uint32 flags, void ** out_cookie)
//Enable midi interrupts
mpu_device->interrupt_op(B_MPU_401_ENABLE_CARD_INT, &mpu_device);
// clear midi-in buffer
mbuf_bytes=0;
mbuf_current=0;
mbuf_start=0;
if ((mpu_device->readsemaphore > B_OK)&&(mpu_device->writesemaphore > B_OK))
{
@ -221,8 +232,6 @@ midi_close(void * cookie)
static status_t
midi_free(void * cookie)
{
//mpu401device * mpu_device = (mpu401device *)cookie;
/* I don't think this is ever called ...*/
#if MPUDEBUG
dprintf("mpu401: free\n");
#endif
@ -271,38 +280,35 @@ mpu401device *mpu_device = (mpu401device *)cookie;
i=0;
*num_bytes=0;
while (count>0)
bestat = acquire_sem_etc ( mpu_device->readsemaphore, 1, B_CAN_INTERRUPT, 0);
if (bestat == B_INTERRUPTED)
{
#if MPUDEBUG
dprintf("mpu401: acquire_sem B_INTERRUPTED!\n");
#endif
return (B_INTERRUPTED);
}
if (bestat != B_OK)
{
#if MPUDEBUG
dprintf("mpu401: acquire_sem not B_OK %d\n",bestat);
#endif
*num_bytes = 1;
return (B_INTERRUPTED);
}
if (bestat == B_OK)
{
bestat = acquire_sem_etc ( mpu_device->readsemaphore, 1, B_CAN_INTERRUPT, 0);
if (bestat == B_INTERRUPTED)
{
#if MPUDEBUG
dprintf("mpu401: acquire_sem B_INTERRUPTED!\n");
#endif
*num_bytes = 1;
return (B_INTERRUPTED);
}
if (bestat == B_WOULD_BLOCK)
{
#if MPUDEBUG
dprintf("mpu401: acquire_sem B_WOULD_BLOCK!\n");
#endif
*num_bytes = 1;
return (B_INTERRUPTED);
}
status = lock();
*(data+i) = mpubuffer[mbuf_start];
i++;
mbuf_start++; // pointer to data in ringbuffer
if (mbuf_start >= (MBUF_ELEMENTS-1))
mbuf_start = 0; //wraparound of ringbuffer
//*num_bytes++; // tell caller how many bytes are being returned in buffer
count--;
*num_bytes =1; // tell caller how many bytes are being returned in buffer
if (mbuf_bytes>0) mbuf_bytes--; // bytes read from buffer, so decrement buffer count
unlock(status);
//dprintf("mpu401: bytes in buffer: %d\n",mbuf_bytes);
}
if (*num_bytes == 0) *num_bytes =1;
return (B_OK);
}
@ -449,7 +455,7 @@ static generic_mpu401_module mpu401_module2 =
{
{
"generic/mpu401/v2",
B_KEEP_LOADED /* 0 */,
0,
std_ops
},
create_device_v2,
@ -466,7 +472,7 @@ static generic_mpu401_module mpu401_module2 =
_EXPORT generic_mpu401_module *modules[] =
{
&mpu401_module,
//&mpu401_module2,
&mpu401_module2,
NULL
};