}
 
        while (uLeft) {
+               DEFINE_WAIT(wait);
+
                while (write_sq.count >= write_sq.max_active) {
+                       prepare_to_wait(&write_sq.action_queue, &wait, TASK_INTERRUPTIBLE);
                        sq_play();
-                       if (write_sq.non_blocking)
+                       if (write_sq.non_blocking) {
+                               finish_wait(&write_sq.action_queue, &wait);
                                return uWritten > 0 ? uWritten : -EAGAIN;
-                       SLEEP(write_sq.action_queue);
-                       if (signal_pending(current))
+                       }
+                       if (write_sq.count < write_sq.max_active)
+                               break;
+
+                       schedule_timeout(HZ);
+                       if (signal_pending(current)) {
+                               finish_wait(&write_sq.action_queue, &wait);
                                return uWritten > 0 ? uWritten : -EINTR;
+                       }
                }
 
+               finish_wait(&write_sq.action_queue, &wait);
+
                /* Here, we can avoid disabling the interrupt by first
                 * copying and translating the data, and then updating
                 * the write_sq variables. Until this is done, the interrupt
                        if (file->f_flags & O_NONBLOCK)
                                return rc;
                        rc = -EINTR;
-                       while (sq->busy) {
-                               SLEEP(sq->open_queue);
-                               if (signal_pending(current))
-                                       return rc;
-                       }
+                       if (wait_event_interruptible(sq->open_queue, !sq->busy))
+                               return rc;
                        rc = 0;
 #else
                        /* OSS manual says we will return EBUSY regardless
        sq_play();      /* there may be an incomplete frame waiting */
 
        while (write_sq.active) {
-               SLEEP(write_sq.sync_queue);
+               wait_event_interruptible_timeout(write_sq.sync_queue,
+                                                !write_sq.active, HZ);
                if (signal_pending(current)) {
                        /* While waiting for audio output to drain, an
                         * interrupt occurred.  Stop audio output immediately