'Records up to ``duration`` seconds of audio from ``source`` (an ``AudioSource`` instance) starting at ``offset`` (or at the beginning if not specified) into an ``AudioData`` instance, which it returns.
If ``duration`` is not specified, then it will record until there is no more audio input.'

def record(self, source, duration=None, offset=None):

    assert isinstance(source, AudioSource), 'Source    must    be    an    audio    source'
    assert (source.stream is not None), 'Audio    source    must    be    entered    before    recording,    see    documentation    for    ``AudioSource``;    are    you    using    ``source``    outside    of    a    ``with``    statement?'
    frames = io.BytesIO()
    seconds_per_buffer = ((source.CHUNK + 0.0) / source.SAMPLE_RATE)
    elapsed_time = 0
    offset_time = 0
    offset_reached = False
    while True:
        if (offset and (not offset_reached)):
            offset_time += seconds_per_buffer
            if (offset_time > offset):
                offset_reached = True
        buffer = source.stream.read(source.CHUNK)
        if (len(buffer) == 0):
            break
        if (offset_reached or (not offset)):
            elapsed_time += seconds_per_buffer
            if (duration and (elapsed_time > duration)):
                break
            frames.write(buffer)
    frame_data = frames.getvalue()
    frames.close()
    return AudioData(frame_data, source.SAMPLE_RATE, source.SAMPLE_WIDTH)
