Beispiel #1
0
    def _decode_audio_packet(self):
        packet = self._packet
        size_out = ctypes.c_int(len(self._audio_buffer))

        while True:
            audio_packet_ptr = ctypes.cast(packet.data, ctypes.c_void_p)
            audio_packet_size = packet.size

            used = av.avbin_decode_audio(self._audio_stream,
                audio_packet_ptr, audio_packet_size,
                self._audio_buffer, size_out)

            if used < 0:
                self._audio_packet_size = 0
                break

            audio_packet_ptr.value += used
            audio_packet_size -= used

            if size_out.value <= 0:
                continue

            # XXX how did this ever work?  replaced with copy below
            # buffer = ctypes.string_at(self._audio_buffer, size_out)

            # XXX to actually copy the data.. but it never used to crash, so
            # maybe I'm  missing something
            buffer = ctypes.create_string_buffer(size_out.value)
            ctypes.memmove(buffer, self._audio_buffer, len(buffer))
            buffer = buffer.raw

            duration = float(len(buffer)) / self.audio_format.bytes_per_second
            self._audio_packet_timestamp = \
                timestamp = timestamp_from_avbin(packet.timestamp)
            return AudioData(buffer, len(buffer), timestamp, duration, []) 
Beispiel #2
0
 def write(self, audio_data):
     if not self._audio_data_list:
         self._head_time = 0.0
         self._head_system_time = time.time()
     self._audio_data_list.append(
         AudioData(None, audio_data.length, audio_data.timestamp,
                   audio_data.duration))
     audio_data.consume(audio_data.length, self.audio_format)
Beispiel #3
0
    def _get_audio_data(self, bytes_):
        bytes_ = min(bytes_, self._max_offset - self._offset)
        if bytes_ <= 0:
            return None

        timestamp = float(self._offset) / self._bytes_per_second
        duration = float(bytes_) / self._bytes_per_second
        data = self._generate_data(bytes_, self._offset)
        self._offset += bytes_

        return AudioData(data, bytes_, timestamp, duration, list())
Beispiel #4
0
    def get_audio_data(self, bytes):
        bytes = min(bytes, self._max_offset - self._offset)
        if bytes <= 0:
            return None

        timestamp = float(self._offset) / self._bytes_per_second
        duration = float(bytes) / self._bytes_per_second
        data = self._generate_data(bytes, self._offset)
        self._offset += bytes

        return AudioData(data, bytes, timestamp, duration, [])
Beispiel #5
0
    def get_audio_data(self, bytes_):
        bytes_ = min(bytes_, self._max_offset - self._offset)
        if not bytes_:
            return None

        data = self._file.read(bytes_)
        self._offset += len(data)

        timestamp = float(self._offset) / self.audio_format.bytes_per_second
        duration = float(bytes_) / self.audio_format.bytes_per_second

        return AudioData(data, len(data), timestamp, duration, list())
Beispiel #6
0
 def get_audio_data(self, bytes) -> (AudioData, None):
     offset = self._tell
     timestamp = float(offset) / self._bytes_per_second
     # Align to sample size
     if self._bytes_per_sample == 2:
         bytes &= 0xfffffffe
     elif self._bytes_per_sample == 4:
         bytes &= 0xfffffffc
     if bytes in _BUFFERS:
         buffer, byref = _BUFFERS[bytes]
     else:
         buffer = ctypes.create_string_buffer(bytes)
         byref = ctypes.byref(buffer)
         _BUFFERS[bytes] = buffer, byref
     frames = bytes // self._bytes_per_sample // self._channels
     self.sunvox.audio_callback(byref, frames, 0, self.sunvox.get_ticks())
     self._tell += bytes
     data = buffer.raw
     if not len(data):
         return None
     duration = float(len(data)) / self._bytes_per_second
     return AudioData(data, len(data), timestamp, duration, [])
Beispiel #7
0
    def _get_audio_data(self, bytes):
        # XXX bytes currently ignored
        while True:
            while self._audio_packet_size > 0:
                size_out = ctypes.c_int(len(self._audio_buffer))

                #print self._audio_stream, self._audio_packet_ptr, self._audio_packet_size, self._audio_buffer, size_out
                used = av.avbin_decode_audio(self._audio_stream,
                                             self._audio_packet_ptr,
                                             self._audio_packet_size,
                                             self._audio_buffer, size_out)

                if used < 0:
                    self._audio_packet_size = 0
                    break

                self._audio_packet_ptr.value += used
                self._audio_packet_size -= used

                if size_out.value <= 0:
                    continue

                buffer = ctypes.string_at(self._audio_buffer, size_out)
                duration = \
                    float(len(buffer)) / self.audio_format.bytes_per_second
                timestamp = self._audio_packet_timestamp
                self._audio_packet_timestamp += duration
                return AudioData(buffer, len(buffer), timestamp, duration)

            packet = self._get_packet_for_stream(self._audio_stream_index)
            if not packet:
                return None

            self._audio_packet_timestamp = \
                timestamp_from_avbin(packet.timestamp)
            self._audio_packet = packet  # keep from GC
            self._audio_packet_ptr = ctypes.cast(packet.data, ctypes.c_void_p)
            self._audio_packet_size = packet.size