Playing WAV data with AVAudioEngineConvert AVAudioPCMBuffer to NSData and backload a pcm into a AVAudioPCMBufferPassing Data between View ControllersMongod complains that there is no /data/db folderRealtime Audio with AVAudioEngineAVAudioEngine track progress of audioBuilding a looping sequencer with AVAudioEngineLevel Metering with AVAudioEngineAdd input callback to AVAudioEngineMatching Input & Output Hardware Settings for AVAudioEngineAVAudioEngine to NSData - wav file doesn't play on serverPlaying Multiple WAV out Multiple Channels AVAudioEngine

How did Arya manage to disguise herself?

Transfer over $10k

Why is Arya visibly scared in the library in S8E3?

Floor tile layout process?

Is this homebrew race based on the Draco Volans lizard species balanced?

Accidentally deleted the "/usr/share" folder

Game of Life meets Chaos Theory

Surprising behavior of Part[ ]

Is it cheaper to drop cargo than to land it?

Is lying to get "gardening leave" fraud?

Why are notes ordered like they are on a piano?

Was Unix ever a single-user OS?

Geometry - Proving a common centroid.

When and why did journal article titles become descriptive, rather than creatively allusive?

Can I use 1000v rectifier diodes instead of 600v rectifier diodes?

How to implement float hashing with approximate equality

How did Captain America use this power?

Parsing with CCGs - lambda part

Melee attacking upwards (enemy on 10ft ceiling)

Survey Confirmation - Emphasize the question or the answer?

Binary Numbers Magic Trick

Does hiding behind 5-ft-wide cover give full cover?

How could a planet have most of its water in the atmosphere?

How to compensate for height when using a ranged attack



Playing WAV data with AVAudioEngine


Convert AVAudioPCMBuffer to NSData and backload a pcm into a AVAudioPCMBufferPassing Data between View ControllersMongod complains that there is no /data/db folderRealtime Audio with AVAudioEngineAVAudioEngine track progress of audioBuilding a looping sequencer with AVAudioEngineLevel Metering with AVAudioEngineAdd input callback to AVAudioEngineMatching Input & Output Hardware Settings for AVAudioEngineAVAudioEngine to NSData - wav file doesn't play on serverPlaying Multiple WAV out Multiple Channels AVAudioEngine






.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty height:90px;width:728px;box-sizing:border-box;








1















Currently, I'm getting an EXC_BAD_ACCESS error on the audio thread, and I'm trying to deduce what is going wrong.



When converting .wav file data from Data to an AVAudioPCMBuffer, do I need to strip the RIFF header first?



import AVFoundation

public class Player : NSObject
let engine = AVAudioEngine()

public override init()
super.init()
do
let _ = engine.mainMixerNode
try engine.start()
catch
print("Player error: (error)")



@objc public func play(_ data: Data)
let format = AVAudioFormat(commonFormat: .pcmFormatInt16, sampleRate: 48000, channels: 2, interleaved: true)!
let buffer = data.toPCMBuffer(format: format)!

let player = AVAudioPlayerNode()
engine.attach(player)
engine.connect(player, to: engine.mainMixerNode, format: nil)

player.scheduleBuffer(buffer, at: nil, completionCallbackType: .dataPlayedBack)
callbackType in
// Nothing in here.

player.play()




Here's the toPCMBuffer extension:



// Taken from: https://stackoverflow.com/a/52731480/2228559
extension Data
func toPCMBuffer(format: AVAudioFormat) -> AVAudioPCMBuffer?
let streamDesc = format.streamDescription.pointee
let frameCapacity = UInt32(count) / streamDesc.mBytesPerFrame
guard let buffer = AVAudioPCMBuffer(pcmFormat: format, frameCapacity: frameCapacity) else return nil

buffer.frameLength = buffer.frameCapacity
let audioBuffer = buffer.audioBufferList.pointee.mBuffers

withUnsafeBytes addr in
audioBuffer.mData?.copyMemory(from: addr, byteCount: Int(audioBuffer.mDataByteSize))


return buffer




Note: I cannot use AVAudioFile because the .wav file data is loaded over-the-wire.










share|improve this question
























  • Have you tried running with sanitizers?

    – Ruurd Adema
    Mar 24 at 10:48











  • No, but using .pcmFormatFloat32 worked for me.

    – aleclarson
    Mar 24 at 13:58

















1















Currently, I'm getting an EXC_BAD_ACCESS error on the audio thread, and I'm trying to deduce what is going wrong.



When converting .wav file data from Data to an AVAudioPCMBuffer, do I need to strip the RIFF header first?



import AVFoundation

public class Player : NSObject
let engine = AVAudioEngine()

public override init()
super.init()
do
let _ = engine.mainMixerNode
try engine.start()
catch
print("Player error: (error)")



@objc public func play(_ data: Data)
let format = AVAudioFormat(commonFormat: .pcmFormatInt16, sampleRate: 48000, channels: 2, interleaved: true)!
let buffer = data.toPCMBuffer(format: format)!

let player = AVAudioPlayerNode()
engine.attach(player)
engine.connect(player, to: engine.mainMixerNode, format: nil)

player.scheduleBuffer(buffer, at: nil, completionCallbackType: .dataPlayedBack)
callbackType in
// Nothing in here.

player.play()




Here's the toPCMBuffer extension:



// Taken from: https://stackoverflow.com/a/52731480/2228559
extension Data
func toPCMBuffer(format: AVAudioFormat) -> AVAudioPCMBuffer?
let streamDesc = format.streamDescription.pointee
let frameCapacity = UInt32(count) / streamDesc.mBytesPerFrame
guard let buffer = AVAudioPCMBuffer(pcmFormat: format, frameCapacity: frameCapacity) else return nil

buffer.frameLength = buffer.frameCapacity
let audioBuffer = buffer.audioBufferList.pointee.mBuffers

withUnsafeBytes addr in
audioBuffer.mData?.copyMemory(from: addr, byteCount: Int(audioBuffer.mDataByteSize))


return buffer




Note: I cannot use AVAudioFile because the .wav file data is loaded over-the-wire.










share|improve this question
























  • Have you tried running with sanitizers?

    – Ruurd Adema
    Mar 24 at 10:48











  • No, but using .pcmFormatFloat32 worked for me.

    – aleclarson
    Mar 24 at 13:58













1












1








1








Currently, I'm getting an EXC_BAD_ACCESS error on the audio thread, and I'm trying to deduce what is going wrong.



When converting .wav file data from Data to an AVAudioPCMBuffer, do I need to strip the RIFF header first?



import AVFoundation

public class Player : NSObject
let engine = AVAudioEngine()

public override init()
super.init()
do
let _ = engine.mainMixerNode
try engine.start()
catch
print("Player error: (error)")



@objc public func play(_ data: Data)
let format = AVAudioFormat(commonFormat: .pcmFormatInt16, sampleRate: 48000, channels: 2, interleaved: true)!
let buffer = data.toPCMBuffer(format: format)!

let player = AVAudioPlayerNode()
engine.attach(player)
engine.connect(player, to: engine.mainMixerNode, format: nil)

player.scheduleBuffer(buffer, at: nil, completionCallbackType: .dataPlayedBack)
callbackType in
// Nothing in here.

player.play()




Here's the toPCMBuffer extension:



// Taken from: https://stackoverflow.com/a/52731480/2228559
extension Data
func toPCMBuffer(format: AVAudioFormat) -> AVAudioPCMBuffer?
let streamDesc = format.streamDescription.pointee
let frameCapacity = UInt32(count) / streamDesc.mBytesPerFrame
guard let buffer = AVAudioPCMBuffer(pcmFormat: format, frameCapacity: frameCapacity) else return nil

buffer.frameLength = buffer.frameCapacity
let audioBuffer = buffer.audioBufferList.pointee.mBuffers

withUnsafeBytes addr in
audioBuffer.mData?.copyMemory(from: addr, byteCount: Int(audioBuffer.mDataByteSize))


return buffer




Note: I cannot use AVAudioFile because the .wav file data is loaded over-the-wire.










share|improve this question
















Currently, I'm getting an EXC_BAD_ACCESS error on the audio thread, and I'm trying to deduce what is going wrong.



When converting .wav file data from Data to an AVAudioPCMBuffer, do I need to strip the RIFF header first?



import AVFoundation

public class Player : NSObject
let engine = AVAudioEngine()

public override init()
super.init()
do
let _ = engine.mainMixerNode
try engine.start()
catch
print("Player error: (error)")



@objc public func play(_ data: Data)
let format = AVAudioFormat(commonFormat: .pcmFormatInt16, sampleRate: 48000, channels: 2, interleaved: true)!
let buffer = data.toPCMBuffer(format: format)!

let player = AVAudioPlayerNode()
engine.attach(player)
engine.connect(player, to: engine.mainMixerNode, format: nil)

player.scheduleBuffer(buffer, at: nil, completionCallbackType: .dataPlayedBack)
callbackType in
// Nothing in here.

player.play()




Here's the toPCMBuffer extension:



// Taken from: https://stackoverflow.com/a/52731480/2228559
extension Data
func toPCMBuffer(format: AVAudioFormat) -> AVAudioPCMBuffer?
let streamDesc = format.streamDescription.pointee
let frameCapacity = UInt32(count) / streamDesc.mBytesPerFrame
guard let buffer = AVAudioPCMBuffer(pcmFormat: format, frameCapacity: frameCapacity) else return nil

buffer.frameLength = buffer.frameCapacity
let audioBuffer = buffer.audioBufferList.pointee.mBuffers

withUnsafeBytes addr in
audioBuffer.mData?.copyMemory(from: addr, byteCount: Int(audioBuffer.mDataByteSize))


return buffer




Note: I cannot use AVAudioFile because the .wav file data is loaded over-the-wire.







objective-c swift macos avfoundation core-audio






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Mar 23 at 13:42







aleclarson

















asked Mar 22 at 19:58









aleclarsonaleclarson

10.5k74168




10.5k74168












  • Have you tried running with sanitizers?

    – Ruurd Adema
    Mar 24 at 10:48











  • No, but using .pcmFormatFloat32 worked for me.

    – aleclarson
    Mar 24 at 13:58

















  • Have you tried running with sanitizers?

    – Ruurd Adema
    Mar 24 at 10:48











  • No, but using .pcmFormatFloat32 worked for me.

    – aleclarson
    Mar 24 at 13:58
















Have you tried running with sanitizers?

– Ruurd Adema
Mar 24 at 10:48





Have you tried running with sanitizers?

– Ruurd Adema
Mar 24 at 10:48













No, but using .pcmFormatFloat32 worked for me.

– aleclarson
Mar 24 at 13:58





No, but using .pcmFormatFloat32 worked for me.

– aleclarson
Mar 24 at 13:58












1 Answer
1






active

oldest

votes


















0














IDK, but my mac crashes if I play interleaved AVAudioPCMBuffers, and garbled audio if they're not float data, so you could convert to non-interleaved float data:



@objc public func play(_ data: Data) 
let sampleRate: Double = 48000

let interleavedFormat = AVAudioFormat(commonFormat: .pcmFormatInt16, sampleRate: sampleRate, channels: 2, interleaved: true)!
let interleavedBuffer = data.toPCMBuffer(format: interleavedFormat)!

let nonInterleavedFormat = AVAudioFormat(commonFormat: .pcmFormatFloat32, sampleRate: sampleRate, channels: 2, interleaved: false)!
let nonInterleavedBuffer = AVAudioPCMBuffer(pcmFormat: nonInterleavedFormat, frameCapacity: interleavedBuffer.frameCapacity)!
nonInterleavedBuffer.frameLength = interleavedBuffer.frameLength

let converter = AVAudioConverter(from: interleavedFormat, to: nonInterleavedFormat)!
try! converter.convert(to: nonInterleavedBuffer, from: interleavedBuffer)

let player = AVAudioPlayerNode()

engine.attach(player)
engine.connect(player, to: engine.mainMixerNode, format: nil)

player.scheduleBuffer(nonInterleavedBuffer, at: nil, completionCallbackType: .dataPlayedBack)
callbackType in
// Nothing in here.


player.play()


extension Data
func toPCMBuffer(format: AVAudioFormat) -> AVAudioPCMBuffer?
assert(format.isInterleaved)

let streamDesc = format.streamDescription.pointee
let frameCapacity = UInt32(count) / streamDesc.mBytesPerFrame
guard let buffer = AVAudioPCMBuffer(pcmFormat: format, frameCapacity: frameCapacity) else return nil

buffer.frameLength = buffer.frameCapacity

let b = UnsafeMutableBufferPointer(start: buffer.int16ChannelData![0], count: buffer.stride * Int(frameCapacity))
let bytesCopied = self.copyBytes(to: b)
assert(bytesCopied == count)

return buffer







share|improve this answer























    Your Answer






    StackExchange.ifUsing("editor", function ()
    StackExchange.using("externalEditor", function ()
    StackExchange.using("snippets", function ()
    StackExchange.snippets.init();
    );
    );
    , "code-snippets");

    StackExchange.ready(function()
    var channelOptions =
    tags: "".split(" "),
    id: "1"
    ;
    initTagRenderer("".split(" "), "".split(" "), channelOptions);

    StackExchange.using("externalEditor", function()
    // Have to fire editor after snippets, if snippets enabled
    if (StackExchange.settings.snippets.snippetsEnabled)
    StackExchange.using("snippets", function()
    createEditor();
    );

    else
    createEditor();

    );

    function createEditor()
    StackExchange.prepareEditor(
    heartbeatType: 'answer',
    autoActivateHeartbeat: false,
    convertImagesToLinks: true,
    noModals: true,
    showLowRepImageUploadWarning: true,
    reputationToPostImages: 10,
    bindNavPrevention: true,
    postfix: "",
    imageUploader:
    brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
    contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
    allowUrls: true
    ,
    onDemand: true,
    discardSelector: ".discard-answer"
    ,immediatelyShowMarkdownHelp:true
    );



    );













    draft saved

    draft discarded


















    StackExchange.ready(
    function ()
    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f55306996%2fplaying-wav-data-with-avaudioengine%23new-answer', 'question_page');

    );

    Post as a guest















    Required, but never shown

























    1 Answer
    1






    active

    oldest

    votes








    1 Answer
    1






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes









    0














    IDK, but my mac crashes if I play interleaved AVAudioPCMBuffers, and garbled audio if they're not float data, so you could convert to non-interleaved float data:



    @objc public func play(_ data: Data) 
    let sampleRate: Double = 48000

    let interleavedFormat = AVAudioFormat(commonFormat: .pcmFormatInt16, sampleRate: sampleRate, channels: 2, interleaved: true)!
    let interleavedBuffer = data.toPCMBuffer(format: interleavedFormat)!

    let nonInterleavedFormat = AVAudioFormat(commonFormat: .pcmFormatFloat32, sampleRate: sampleRate, channels: 2, interleaved: false)!
    let nonInterleavedBuffer = AVAudioPCMBuffer(pcmFormat: nonInterleavedFormat, frameCapacity: interleavedBuffer.frameCapacity)!
    nonInterleavedBuffer.frameLength = interleavedBuffer.frameLength

    let converter = AVAudioConverter(from: interleavedFormat, to: nonInterleavedFormat)!
    try! converter.convert(to: nonInterleavedBuffer, from: interleavedBuffer)

    let player = AVAudioPlayerNode()

    engine.attach(player)
    engine.connect(player, to: engine.mainMixerNode, format: nil)

    player.scheduleBuffer(nonInterleavedBuffer, at: nil, completionCallbackType: .dataPlayedBack)
    callbackType in
    // Nothing in here.


    player.play()


    extension Data
    func toPCMBuffer(format: AVAudioFormat) -> AVAudioPCMBuffer?
    assert(format.isInterleaved)

    let streamDesc = format.streamDescription.pointee
    let frameCapacity = UInt32(count) / streamDesc.mBytesPerFrame
    guard let buffer = AVAudioPCMBuffer(pcmFormat: format, frameCapacity: frameCapacity) else return nil

    buffer.frameLength = buffer.frameCapacity

    let b = UnsafeMutableBufferPointer(start: buffer.int16ChannelData![0], count: buffer.stride * Int(frameCapacity))
    let bytesCopied = self.copyBytes(to: b)
    assert(bytesCopied == count)

    return buffer







    share|improve this answer



























      0














      IDK, but my mac crashes if I play interleaved AVAudioPCMBuffers, and garbled audio if they're not float data, so you could convert to non-interleaved float data:



      @objc public func play(_ data: Data) 
      let sampleRate: Double = 48000

      let interleavedFormat = AVAudioFormat(commonFormat: .pcmFormatInt16, sampleRate: sampleRate, channels: 2, interleaved: true)!
      let interleavedBuffer = data.toPCMBuffer(format: interleavedFormat)!

      let nonInterleavedFormat = AVAudioFormat(commonFormat: .pcmFormatFloat32, sampleRate: sampleRate, channels: 2, interleaved: false)!
      let nonInterleavedBuffer = AVAudioPCMBuffer(pcmFormat: nonInterleavedFormat, frameCapacity: interleavedBuffer.frameCapacity)!
      nonInterleavedBuffer.frameLength = interleavedBuffer.frameLength

      let converter = AVAudioConverter(from: interleavedFormat, to: nonInterleavedFormat)!
      try! converter.convert(to: nonInterleavedBuffer, from: interleavedBuffer)

      let player = AVAudioPlayerNode()

      engine.attach(player)
      engine.connect(player, to: engine.mainMixerNode, format: nil)

      player.scheduleBuffer(nonInterleavedBuffer, at: nil, completionCallbackType: .dataPlayedBack)
      callbackType in
      // Nothing in here.


      player.play()


      extension Data
      func toPCMBuffer(format: AVAudioFormat) -> AVAudioPCMBuffer?
      assert(format.isInterleaved)

      let streamDesc = format.streamDescription.pointee
      let frameCapacity = UInt32(count) / streamDesc.mBytesPerFrame
      guard let buffer = AVAudioPCMBuffer(pcmFormat: format, frameCapacity: frameCapacity) else return nil

      buffer.frameLength = buffer.frameCapacity

      let b = UnsafeMutableBufferPointer(start: buffer.int16ChannelData![0], count: buffer.stride * Int(frameCapacity))
      let bytesCopied = self.copyBytes(to: b)
      assert(bytesCopied == count)

      return buffer







      share|improve this answer

























        0












        0








        0







        IDK, but my mac crashes if I play interleaved AVAudioPCMBuffers, and garbled audio if they're not float data, so you could convert to non-interleaved float data:



        @objc public func play(_ data: Data) 
        let sampleRate: Double = 48000

        let interleavedFormat = AVAudioFormat(commonFormat: .pcmFormatInt16, sampleRate: sampleRate, channels: 2, interleaved: true)!
        let interleavedBuffer = data.toPCMBuffer(format: interleavedFormat)!

        let nonInterleavedFormat = AVAudioFormat(commonFormat: .pcmFormatFloat32, sampleRate: sampleRate, channels: 2, interleaved: false)!
        let nonInterleavedBuffer = AVAudioPCMBuffer(pcmFormat: nonInterleavedFormat, frameCapacity: interleavedBuffer.frameCapacity)!
        nonInterleavedBuffer.frameLength = interleavedBuffer.frameLength

        let converter = AVAudioConverter(from: interleavedFormat, to: nonInterleavedFormat)!
        try! converter.convert(to: nonInterleavedBuffer, from: interleavedBuffer)

        let player = AVAudioPlayerNode()

        engine.attach(player)
        engine.connect(player, to: engine.mainMixerNode, format: nil)

        player.scheduleBuffer(nonInterleavedBuffer, at: nil, completionCallbackType: .dataPlayedBack)
        callbackType in
        // Nothing in here.


        player.play()


        extension Data
        func toPCMBuffer(format: AVAudioFormat) -> AVAudioPCMBuffer?
        assert(format.isInterleaved)

        let streamDesc = format.streamDescription.pointee
        let frameCapacity = UInt32(count) / streamDesc.mBytesPerFrame
        guard let buffer = AVAudioPCMBuffer(pcmFormat: format, frameCapacity: frameCapacity) else return nil

        buffer.frameLength = buffer.frameCapacity

        let b = UnsafeMutableBufferPointer(start: buffer.int16ChannelData![0], count: buffer.stride * Int(frameCapacity))
        let bytesCopied = self.copyBytes(to: b)
        assert(bytesCopied == count)

        return buffer







        share|improve this answer













        IDK, but my mac crashes if I play interleaved AVAudioPCMBuffers, and garbled audio if they're not float data, so you could convert to non-interleaved float data:



        @objc public func play(_ data: Data) 
        let sampleRate: Double = 48000

        let interleavedFormat = AVAudioFormat(commonFormat: .pcmFormatInt16, sampleRate: sampleRate, channels: 2, interleaved: true)!
        let interleavedBuffer = data.toPCMBuffer(format: interleavedFormat)!

        let nonInterleavedFormat = AVAudioFormat(commonFormat: .pcmFormatFloat32, sampleRate: sampleRate, channels: 2, interleaved: false)!
        let nonInterleavedBuffer = AVAudioPCMBuffer(pcmFormat: nonInterleavedFormat, frameCapacity: interleavedBuffer.frameCapacity)!
        nonInterleavedBuffer.frameLength = interleavedBuffer.frameLength

        let converter = AVAudioConverter(from: interleavedFormat, to: nonInterleavedFormat)!
        try! converter.convert(to: nonInterleavedBuffer, from: interleavedBuffer)

        let player = AVAudioPlayerNode()

        engine.attach(player)
        engine.connect(player, to: engine.mainMixerNode, format: nil)

        player.scheduleBuffer(nonInterleavedBuffer, at: nil, completionCallbackType: .dataPlayedBack)
        callbackType in
        // Nothing in here.


        player.play()


        extension Data
        func toPCMBuffer(format: AVAudioFormat) -> AVAudioPCMBuffer?
        assert(format.isInterleaved)

        let streamDesc = format.streamDescription.pointee
        let frameCapacity = UInt32(count) / streamDesc.mBytesPerFrame
        guard let buffer = AVAudioPCMBuffer(pcmFormat: format, frameCapacity: frameCapacity) else return nil

        buffer.frameLength = buffer.frameCapacity

        let b = UnsafeMutableBufferPointer(start: buffer.int16ChannelData![0], count: buffer.stride * Int(frameCapacity))
        let bytesCopied = self.copyBytes(to: b)
        assert(bytesCopied == count)

        return buffer








        share|improve this answer












        share|improve this answer



        share|improve this answer










        answered Mar 25 at 0:23









        Rhythmic FistmanRhythmic Fistman

        24.8k458113




        24.8k458113





























            draft saved

            draft discarded
















































            Thanks for contributing an answer to Stack Overflow!


            • Please be sure to answer the question. Provide details and share your research!

            But avoid


            • Asking for help, clarification, or responding to other answers.

            • Making statements based on opinion; back them up with references or personal experience.

            To learn more, see our tips on writing great answers.




            draft saved


            draft discarded














            StackExchange.ready(
            function ()
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f55306996%2fplaying-wav-data-with-avaudioengine%23new-answer', 'question_page');

            );

            Post as a guest















            Required, but never shown





















































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown

































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown







            Popular posts from this blog

            SQL error code 1064 with creating Laravel foreign keysForeign key constraints: When to use ON UPDATE and ON DELETEDropping column with foreign key Laravel error: General error: 1025 Error on renameLaravel SQL Can't create tableLaravel Migration foreign key errorLaravel php artisan migrate:refresh giving a syntax errorSQLSTATE[42S01]: Base table or view already exists or Base table or view already exists: 1050 Tableerror in migrating laravel file to xampp serverSyntax error or access violation: 1064:syntax to use near 'unsigned not null, modelName varchar(191) not null, title varchar(191) not nLaravel cannot create new table field in mysqlLaravel 5.7:Last migration creates table but is not registered in the migration table

            용인 삼성생명 블루밍스 목차 통계 역대 감독 선수단 응원단 경기장 같이 보기 외부 링크 둘러보기 메뉴samsungblueminx.comeh선수 명단용인 삼성생명 블루밍스용인 삼성생명 블루밍스ehsamsungblueminx.comeheheheh

            155 수학 과학 기타 둘러보기 메뉴eh추가해eh문서를 완성해