Ejemplo n.º 1
0
    def fill_buffer(self, buffer):
        if self.packet_size <= 0:
            self.read_packet()

        if self.packet_size == 0:  # EOS
            return False

        sample_buffer_size = ctypes.c_int()
        len = avcodec.avcodec_decode_audio(self.codec, self.sample_buffer,
                                           sample_buffer_size,
                                           self.packet_data, self.packet_size)
        if len < 0:
            # Error, skip frame
            raise Exception('frame error TODO')

        if sample_buffer_size.value > 0:
            al.alBufferData(buffer, self.buffer_format, self.sample_buffer,
                            sample_buffer_size.value, self.sample_rate)

        # Advance buffer pointer
        self.packet_data = ctypes.c_uint8.from_address(
            ctypes.addressof(self.packet_data) + len)
        self.packet_size -= len

        return True
Ejemplo n.º 2
0
    def fill_buffer(self, buffer):
        if self.packet_size <= 0:
            self.read_packet()

        if self.packet_size == 0:  # EOS
            return False

        sample_buffer_size = ctypes.c_int()
        len = avcodec.avcodec_decode_audio(self.codec,
                                           self.sample_buffer,
                                           sample_buffer_size,
                                           self.packet_data,
                                           self.packet_size)
        if len < 0:
            # Error, skip frame
            raise Exception('frame error TODO')

        if sample_buffer_size.value > 0:
            al.alBufferData(buffer, self.buffer_format,
                            self.sample_buffer, sample_buffer_size.value,
                            self.sample_rate)

        # Advance buffer pointer
        self.packet_data = ctypes.c_uint8.from_address(
            ctypes.addressof(self.packet_data) + len)
        self.packet_size -= len

        return True
Ejemplo n.º 3
0
    def refill(self, write_size):
        if _debug:
            print 'refill', write_size

        self._lock.acquire()

        while write_size > self._min_buffer_size:
            audio_data = self.source_group.get_audio_data(write_size)
            if not audio_data:
                self._eos = True
                self._events.append(
                    (self._write_cursor, MediaEvent(0, 'on_eos')))
                self._events.append(
                    (self._write_cursor, MediaEvent(0, 'on_source_group_eos')))
                break

            for event in audio_data.events:
                cursor = self._write_cursor + event.timestamp * \
                    self.source_group.audio_format.bytes_per_second
                self._events.append((cursor, event))

            context.lock()
            buffer = bufferPool.getBuffer(self._al_source)
            al.alBufferData(buffer, 
                            self._al_format,
                            audio_data.data,
                            audio_data.length,
                            self.source_group.audio_format.sample_rate)
            if _debug_buffers:
                error = al.alGetError()
                if error != 0:
                    print("BUFFER DATA ERROR: " + str(error))
            al.alSourceQueueBuffers(self._al_source, 1, ctypes.byref(buffer))
            if _debug_buffers:
                error = al.alGetError()
                if error != 0:
                    print("QUEUE BUFFER ERROR: " + str(error)) 
            context.unlock()

            self._write_cursor += audio_data.length
            self._buffer_sizes.append(audio_data.length)
            self._buffer_timestamps.append(audio_data.timestamp)
            write_size -= audio_data.length

        # Check for underrun stopping playback
        if self._playing:
            state = al.ALint()
            context.lock()
            al.alGetSourcei(self._al_source, al.AL_SOURCE_STATE, state)
            if state.value != al.AL_PLAYING:
                if _debug:
                    print 'underrun'
                al.alSourcePlay(self._al_source)
            context.unlock()

        self._lock.release()
Ejemplo n.º 4
0
    def refill(self, write_size):
        if _debug:
            print 'refill', write_size

        self._lock.acquire()

        while write_size > self._min_buffer_size:
            audio_data = self.source_group.get_audio_data(write_size)
            if not audio_data:
                self._eos = True
                self._events.append(
                    (self._write_cursor, MediaEvent(0, 'on_eos')))
                self._events.append(
                    (self._write_cursor, MediaEvent(0, 'on_source_group_eos')))
                break

            for event in audio_data.events:
                cursor = self._write_cursor + event.timestamp * \
                    self.source_group.audio_format.bytes_per_second
                self._events.append((cursor, event))

            context.lock()
            buffer = bufferPool.getBuffer(self._al_source)
            al.alBufferData(buffer,
                            self._al_format,
                            audio_data.data,
                            audio_data.length,
                            self.source_group.audio_format.sample_rate)
            if _debug_buffers:
                error = al.alGetError()
                if error != 0:
                    print("BUFFER DATA ERROR: " + str(error))
            al.alSourceQueueBuffers(self._al_source, 1, ctypes.byref(buffer))
            if _debug_buffers:
                error = al.alGetError()
                if error != 0:
                    print("QUEUE BUFFER ERROR: " + str(error))
            context.unlock()

            self._write_cursor += audio_data.length
            self._buffer_sizes.append(audio_data.length)
            self._buffer_timestamps.append(audio_data.timestamp)
            write_size -= audio_data.length

        # Check for underrun stopping playback
        if self._playing:
            state = al.ALint()
            context.lock()
            al.alGetSourcei(self._al_source, al.AL_SOURCE_STATE, state)
            if state.value != al.AL_PLAYING:
                if _debug:
                    print 'underrun'
                al.alSourcePlay(self._al_source)
            context.unlock()

        self._lock.release()
Ejemplo n.º 5
0
    def refill(self, write_size):
        if _debug:
            print "refill", write_size

        self._lock.acquire()

        while write_size > self._min_buffer_size:
            audio_data = self.source_group.get_audio_data(write_size)
            if not audio_data:
                self._eos = True
                self._events.append((self._write_cursor, MediaEvent(0, "on_eos")))
                self._events.append((self._write_cursor, MediaEvent(0, "on_source_group_eos")))
                break

            for event in audio_data.events:
                cursor = self._write_cursor + event.timestamp * self.source_group.audio_format.bytes_per_second
                self._events.append((cursor, event))

            buffer = al.ALuint()
            context.lock()
            al.alGenBuffers(1, buffer)
            al.alBufferData(
                buffer, self._al_format, audio_data.data, audio_data.length, self.source_group.audio_format.sample_rate
            )
            al.alSourceQueueBuffers(self._al_source, 1, ctypes.byref(buffer))
            context.unlock()

            self._write_cursor += audio_data.length
            self._buffer_sizes.append(audio_data.length)
            self._buffer_timestamps.append(audio_data.timestamp)
            write_size -= audio_data.length

        # Check for underrun stopping playback
        if self._playing:
            state = al.ALint()
            context.lock()
            al.alGetSourcei(self._al_source, al.AL_SOURCE_STATE, state)
            if state.value != al.AL_PLAYING:
                if _debug:
                    print "underrun"
                al.alSourcePlay(self._al_source)
            context.unlock()

        self._lock.release()